relance de l'exception python.Lequel attraper ?
Question
J'apprends à utiliser Python.Je viens de tomber sur cet article :http://nedbatchelder.com/blog/200711/retrowing_exceptions_in_python.htmlIl décrit la relance des exceptions en python, comme ceci :
try:
do_something_dangerous()
except:
do_something_to_apologize()
raise
Puisque vous relancez l'exception, il devrait y avoir une instruction "outer catch-sauf".Mais maintenant, je réfléchissais.Que se passe-t-il si le do_something_to_apologize() à l'intérieur de l'exception génère une erreur.Lequel sera pris dans la « capture sauf » extérieure ?Celui que vous relancez ou celui lancé par do_something_to_apologize() ?Ou l'exception avec la priorité la plus élevée sera-t-elle détectée en premier ?
La solution
Essayez-le et voyez :
def failure():
raise ValueError, "Real error"
def apologize():
raise TypeError, "Apology error"
try:
failure()
except ValueError:
apologize()
raise
Le résultat:
Traceback (most recent call last):
File "<pyshell#14>", line 10, in <module>
apologize()
File "<pyshell#14>", line 5, in apologize
raise TypeError, "Apology error"
TypeError: Apology error
La raison:la "vraie" erreur de la fonction d'origine a déjà été détectée par le except
. apologize
génère une nouvelle erreur avant le raise
est atteint.Par conséquent, la raise
dans le except
La clause n'est jamais exécutée et seule l'erreur des excuses se propage vers le haut.Si apologize
génère une erreur, Python n'a aucun moyen de savoir que vous alliez déclencher une exception différente après apologize
.
Notez que dans Python 3, le traçage mentionnera les deux exceptions, avec un message expliquant comment la seconde est née :
Traceback (most recent call last):
File "./prog.py", line 9, in <module>
File "./prog.py", line 2, in failure
ValueError: Real error
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "./prog.py", line 11, in <module>
File "./prog.py", line 5, in apologize
TypeError: Apology error
Cependant, la deuxième exception (l'exception des « excuses ») reste la seule qui se propage vers l'extérieur et peut être interceptée par un niveau supérieur. except
clause.L'exception d'origine est mentionnée dans le traçage mais est intégrée dans le dernier et ne peut plus être détectée.
Autres conseils
L'exception projetée par do_something_to_apologize () sera prise.La maigre contenant une augmentation ne fonctionnera jamais, à cause de l'exception projetée par DO_SOMOATHATHOIATATRY_TO_APOGIZE.En outre, je ne crois pas qu'il y ait une idée de "priorité" dans les exceptions python.