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 ?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top