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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top