lever from
, mais l'histoire de base reste la même avec Python 2.7. *Cette fois, je voudrais parler de l'utilisation d'une instance d'une classe d'exception Python directement comme argument de la classe d'exception, mais en premier lieu
Je ne suis pas sûr de la situation "** Créez une instance de la classe d'exception directement en tant qu'argument de la classe d'exception **".
Je suis sûr qu'il y a des gens qui disent cela, alors définissons une situation un peu plus précise.
Tout d'abord, disons que vous avez créé un module de spam en Python, préparé SpamError
comme classe de base pour les exceptions de module et créé une classe d'exception personnaliséeSpamIndexError
qui a hérité de SpamError
et du standard Python ʻIndexError`.
Cela ressemble à ceci lorsque vous l'écrivez réellement.
spam.py
class SpamError(Exception):
pass
class SpamIndexError(SpamError, IndexError):
pass
Ensuite, en raison de l'exigence selon laquelle les utilisateurs qui utilisent le module spam peuvent compléter les erreurs standard Python qui se produisent dans le module spam avec ʻexcept spam.SpamError comme exception: `etc., dans le module spam
spam.py
try:
[][0] #Une erreur d'index se produit
except IndexError as original:
raise SpamIndexError(original) from original
J'ai décidé d'écrire un code comme celui-ci.
La raison pour laquelle l'argument de SpamError
dans la dernière ligne est ʻoriginal, qui est une exception complétée par l'instruction except, est destiné à afficher le message équivalent à ʻIndexError
d'origine.
C'est une pratique courante dans de nombreuses sources.
Lorsque j'exécute le code ci-dessus,
python
Traceback (most recent call last):
File "./spam.py", line 16, in <module>
[][0] #Une erreur d'index se produit
IndexError: list index out of range
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "./spam.py", line 18, in <module>
raise SpamIndexError(original) from original
spam.SpamIndexError: list index out of range
Est affiché.
Les deux ʻIndexError et
SpamIndexErrorsont affichés comme
index de liste hors de portée`.
Il n'y a pas de problème pour l'instant.
Mais malheureusement si c'était une KeyError
au lieu d'une ʻIndexError`
python
Traceback (most recent call last):
File "./spam.py", line 16, in <module>
{}[0] #KeyError se produit
KeyError: 0
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "./spam.py", line 18, in <module>
raise SpamKeyError(original) from original
spam.SpamKeyError: KeyError(0,)
Sera affiché comme ça.
L'original KeyError
est affiché comme KeyError: 0
, mais le SpamKeyError
est affiché commespam.SpamKeyError: KeyError (0,)
.
ʻIndexError évalue l'argument avec
str () , mais
KeyError évalue avec
repr () `quand il y a un argument, c'est donc le cas.
Pour éviter cela
python
raise SpamKeyError(original) from original
Ligne,
python
raise SpamKeyError(*original.args) from original
Au lieu de ʻoriginal, prenez l'argument de l'exception d'origine,
* original.args`.
Puis
python
Traceback (most recent call last):
File "./spam.py", line 16, in <module>
{}[0] #KeyError se produit
KeyError: 0
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "./spam.py", line 18, in <module>
raise SpamKeyError(*original.args) from original
spam.SpamKeyError: 0
S'affiche et «SpamKeyError» s'affiche de la même manière que l'original «KeyError».
Cependant, il est acceptable de prendre * original.args
comme argument uniquement si l'exception que vous générez hérite de la classe de l'exception d'origine.
Si non,
python
raise SpamError(str(original)) from original
Il est prudent de placer les exceptions complétées dans str ()
et d'utiliser de force une chaîne de caractères comme argument.
Si vous voulez lever une classe d'exception qui hérite simplement de la classe ʻException`,
python
raise SpamError(original) from original
Il est normal de dire que vous n'avez pas à le placer dans str ()
like, mais dans ce cas, l'exception qui était affichée comme KeyError: 0
est affichée comme spam.SpamError: 0
. Par conséquent, il devient difficile de comprendre de quel type d'erreur il s'agit du message.
Dans tous les cas, ce serait une mauvaise idée d'utiliser simplement l'instance de classe d'exception ʻoriginal` comme argument.
Recommended Posts