J'ai essayé de résumer la gestion des exceptions Python

Gestion des exceptions

Aujourd'hui, je vais vous expliquer ** erreur **. C'est un contenu rudimentaire, mais il est normal d'écrire une erreur `` essayez ~ sauf '', non? Si tel est le cas, veuillez vous y référer. De plus, s'il y a une erreur dans l'explication, je vous serais reconnaissant de bien vouloir commenter.

À propos, les erreurs qui se produisent en Python sont grossièrement divisées en deux types. erreur de syntaxe </ font> et exception </ font>.

Erreur de syntaxe

Cela se produit lorsque vous pouvez déterminer que vous avez tort avant d'exécuter le programme. Par exemple, une erreur qui se produit lorsque vous utilisez un nom de variable qui ne répond pas aux règles d'identificateur, l'indentation est incorrecte ou la syntaxe est incorrecte de toute façon. Écrivez ʻa [0] comme ʻa [0}, écrivez ʻif comme ʻof ... (Avez-vous fait cela? J'ai ...) Je ne peux pas vous donner d'exemple. Hmm. En termes simples, les erreurs de syntaxe sont des erreurs grammaticales qui diminuent lorsque vous vous entraînez à écrire des programmes. J'écrirai un exemple pour le moment lol

#Exemples d'erreurs de syntaxe
a = [1, 2, 3]
print(a[3})

production

    print(a[3})
             ^
SyntaxError: invalid syntax

exception

Il s'agit d'une erreur qui se produit lorsque l'ordinateur (interprète?) Détermine «Ne peut pas gérer cela?» Lors de l'exécution du programme. Dans un exemple simple


a = [1, 2, 3]
print(a[3])

production

      1 a = [1, 2, 3]
----> 2 print(a[3])

IndexError: list index out of range

Puisque les éléments du tableau n'existent que jusqu'au numéro d'index 2, une exception se produira naturellement lors de la tentative de sortie de ʻa [3] . J'ai montré ʻIndexError comme exemple d'exception ici, mais il y en a beaucoup plus.

Attrapez l'exception

Désormais, lorsque vous exécutez un programme, vous souhaiterez peut-être continuer le traitement même si une exception se produit. Dans ce cas, utilisez le familier try ~ except. Empêchons le programme de s'arrêter même si ZeroDivisionError apparaît en raison de la gestion des exceptions.


a = 1
b = 0

try:
    print(a/b)
except ZeroDivisionError:
    print('Vous ne pouvez pas le diviser par 0, non? J'ai une erreur ZeroDivisionError')
finally:
    print('La division est difficile')

production

Vous ne pouvez pas le diviser par 0, non? J'ai une erreur ZeroDivisionError
La division est difficile

Vous pouvez ajouter finally après le dernier nettoyage, comme dans l'exemple ci-dessus. Ceci est exécuté en dernier, qu'une exception se produise ou non, où le traitement est interrompu et terminé.

Attrapez plusieurs exceptions

ʻExcept` peut être spécifié pour que le taple puisse attraper plusieurs exceptions comme suit:


try:
    a = int(input('a = '))
    b = int(input('b = '))
    print(a/b)
except (ValueError, ZeroDivisionError):
    print('J'obtiens une erreur de valeur ou une erreur de division zéro')

Sortie 1

a = 1.5
J'obtiens une erreur de valeur ou une erreur de division zéro

Sortie 2

a = 1
b = 0
J'obtiens une erreur de valeur ou une erreur de division zéro

Nommez l'exception

En outre, vous pouvez nommer l'exception qui se produit. Dans ce qui suit, je tape pour lever une ValueError ou ZeroDivisionError, mais j'attrape l'exception qui s'est produite et la nomme ʻER`.


try:
    a = int(input('a = '))
    b = int(input('b = '))
    print(a/b)
except (ValueError, ZeroDivisionError) as ER:
    print(f'{type(ER)}Est passe')

Sortie 1

a = 1.5
<class 'ValueError'>Est passe

Sortie 2

a = 1
b = 0
<class 'ZeroDivisionError'>Est passe

Veuillez noter que le nom ʻER ne peut être utilisé que dans la suite de ʻexcept. Si vous faites ce qui suit, NameError se produira (car c'est un gros problème, attrapons également cette NameError).


try:
    a = int(input('a = '))
    b = int(input('b = '))
    print(a/b)
except (ValueError, ZeroDivisionError) as ER:
    pass

try:
    print(ER)
except NameError:
    print('Qu'est-ce que ER?')

production

a = 1.5
Qu'est-ce que ER?

Lever une exception avec augmentation

Vous pouvez également déclencher intentionnellement une exception avec rise. Cependant, vous ne pouvez utiliser ici que des sous-classes ou des instances de la `` classe BaseException ''. (Comme nous le verrons plus tard, la plupart des exceptions courantes sont des sous-classes de cette BaseException.)


def ErFunc(b: int) -> None:
    if b == 0:
        raise ZeroDivisionError        
b = 0
try:
    ErFunc(b)
except BaseException as ER:
    print(f'{type(ER)}Se produit')

production

<class 'ZeroDivisionError'>Se produit

Puisque la classe BaseException est spécifiée ici, toute classe dérivée peut être interceptée. Ici, le ZeroDivisionError est intercepté.

Exception définie par l'utilisateur

Enfin, vous pouvez également utiliser des classes pour créer des classes d'exceptions définies par l'utilisateur. Ce qui suit est un programme qui trouve la somme de deux nombres naturels à un seul chiffre, mais lève une exception lorsqu'un nombre négatif ou un nombre à deux chiffres est entré ou lorsque la somme devient deux chiffres. La classe ParameterRangeException et la classe ReturnRangeException sont des classes liées à la plage, elles héritent donc de la classe RangeException. Bien sûr, il n'y a aucun problème si vous héritez de la classe standard intégrée ʻException`.


class RangeException(Exception):
    pass

class ParameterRangeException(RangeException):
    pass

class ReturnRangeException(RangeException):
    pass

def add(a: int, b: int) -> int:

    if not 0 < a < 10:
        raise ParameterRangeException
    
    if not 0 < b < 10:
        raise ParameterRangeException
        
    if a + b > 10:
        raise ReturnRangeException
    else:
        return a + b

try:
    a = int(input())
    b = int(input())
    print(f'La somme des deux nombres{add(a, b)}Deshi')
except ParameterRangeException as PRE:
    print(f'{type(PRE)}Se produit. L'argument formel est 1~Ça doit être 9')
except ReturnRangeException as RRE:
    print(f'{type(RRE)}Se produit. Je dois rendre la valeur de retour 9 ou moins')
finally:
    print('C'est tout pour l'exception')

Sortie 1

1
8
La somme des deux nombres est 9
C'est tout pour l'exception

Sortie 2

2
11
<class '__main__.ParameterRangeException'>Se produit. L'argument formel est 1~Ça doit être 9
C'est tout pour l'exception

Sortie 3

5
7
<class '__main__.ReturnRangeException'>Se produit. Je dois rendre la valeur de retour 9 ou moins
C'est tout pour l'exception

Supplément

  • La classe parente pour les exceptions intégrées standard fournies par Python est la classe BaseException. Avec ceci comme parent, il y a une classe ʻException, et la classe ValueError et la classe ʻIndexError existent sous une forme qui en hérite.

--Lors de la création d'une exception définie par l'utilisateur, ne mettez pas BaseException dans l'argument de ʻUserExceptionClass (). De par sa conception, la classe BaseException` ne semble pas supposer qu'elle est héritée par des exceptions définies par l'utilisateur.

--Il existe une classe ʻArithmeticError comme classe enfant de la classe BaseException, mais il y a la classe ʻOverflowError et la classe ZeroDivisionError sous cette classe. Si vous voulez gérer les erreurs arithmétiques, vous pouvez mettre ʻArithmeticError dans l'argument lors de la création d'une exception définie par l'utilisateur (toute classe sous la classe ʻException est OK).

Recommended Posts