python-Ausnahme erneut auslösen.Was zu fangen?
Frage
Ich lerne Python zu benutzen.Ich bin gerade auf diesen Artikel gestoßen:http://nedbatchelder.com/blog/200711/rethrowing_exceptions_in_python.html Es beschreibt das erneute Auslösen von Ausnahmen in Python wie folgt:
try:
do_something_dangerous()
except:
do_something_to_apologize()
raise
Da Sie die Ausnahme erneut auslösen, sollte es eine "äußere catch-except" -Anweisung geben.Aber jetzt dachte ich nach.Was ist, wenn do_something_to_apologize () innerhalb der Ausnahme einen Fehler auslöst.Welcher wird im äußeren "Fang-außer" gefangen?Die, die Sie erneut werfen, oder die, die von do_something_to_apologize() geworfen wird?Oder wird die Ausnahme mit der höchsten Priorität zuerst erwischt?
Lösung
Probieren Sie es aus und sehen Sie:
def failure():
raise ValueError, "Real error"
def apologize():
raise TypeError, "Apology error"
try:
failure()
except ValueError:
apologize()
raise
Ergebnis:
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
Grund:der "echte" Fehler der ursprünglichen Funktion wurde bereits von der abgefangen except
. apologize
löst einen neuen Fehler aus vor dem raise
ist erreicht.Daher ist die raise
in der except
-Klausel wird niemals ausgeführt, und nur der Fehler der Entschuldigung breitet sich nach oben aus.Wenn apologize
löst einen Fehler aus, Python kann nicht wissen, dass Sie danach eine andere Ausnahme auslösen würden apologize
.
Beachten Sie, dass in Python 3 im Traceback Folgendes erwähnt wird beide ausnahmen, mit einer Nachricht, die erklärt, wie die zweite entstanden ist:
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
Die zweite Ausnahme (die "Entschuldigungs" -Ausnahme) ist jedoch immer noch die einzige, die sich nach außen ausbreitet und von einer höheren Ebene abgefangen werden kann except
Klausel.Die ursprüngliche Ausnahme wird im Traceback erwähnt, wird aber im späteren subsumiert und kann nicht mehr abgefangen werden.
Andere Tipps
Die Ausnahme von do_something_to_apologize () wird gefangen.Die Zeile mit Raise läuft nie aus, da die Ausnahme von do_something_to_apologize geworfen wird.Ich glaube auch nicht, dass es in Python-Ausnahmen jede Idee von "Priorität" gibt.