Der Unterschied besteht darin, dass bei Verwendung from
das __cause__
Attribut festgelegt wird und die Nachricht angibt, dass die Ausnahme direkt durch verursacht wurde . Wenn Sie das weglassen, from
wird no __cause__
gesetzt, aber das __context__
Attribut kann auch gesetzt werden, und der Traceback zeigt dann den Kontext an, als ob während der Behandlung etwas anderes passiert wäre .
Das Festlegen des __context__
Ereignisses erfolgt, wenn Sie es raise
in einem Ausnahmebehandler verwendet haben. Wenn Sie raise
irgendwo anders verwendet haben, ist auch nein __context__
eingestellt.
Wenn a __cause__
gesetzt ist, __suppress_context__ = True
wird auch für die Ausnahme ein Flag gesetzt. Wenn auf __suppress_context__
gesetzt, True
wird das __context__
beim Drucken eines Tracebacks ignoriert.
Wenn man von einem Exception - Handler heben, das Sie nicht wollen , um den Kontext zeigen (nicht will , eine andere Ausnahme geschah während der Handhabung Nachricht), dann verwenden , raise ... from None
um Satz __suppress_context__
zu True
.
Mit anderen Worten, Python legt einen Kontext für Ausnahmen fest, damit Sie überprüfen können, wo eine Ausnahme ausgelöst wurde, und sehen können, ob eine andere Ausnahme durch diese ersetzt wurde. Sie können einer Ausnahme auch eine Ursache hinzufügen , indem Sie den Traceback für die andere Ausnahme explizit machen (andere Formulierung verwenden), und der Kontext wird ignoriert (kann jedoch beim Debuggen weiterhin überprüft werden). Mit raise ... from None
können Sie den zu druckenden Kontext unterdrücken.
Siehe die raise
Erklärung Dokumentation :
Die from
Klausel wird für die Verkettung von Ausnahmen verwendet: Wenn angegeben, muss der zweite Ausdruck eine andere Ausnahmeklasse oder -instanz sein, die dann als __cause__
Attribut (das beschreibbar ist) an die ausgelöste Ausnahme angehängt wird. Wenn die ausgelöste Ausnahme nicht behandelt wird, werden beide Ausnahmen gedruckt:
>>> try:
... print(1 / 0)
... except Exception as exc:
... raise RuntimeError("Something bad happened") from exc
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ZeroDivisionError: int division or modulo by zero
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
RuntimeError: Something bad happened
Ein ähnlicher Mechanismus funktioniert implizit, wenn eine Ausnahme in einem Ausnahmehandler oder einer finally
Klausel ausgelöst wird: Die vorherige Ausnahme wird dann als __context__
Attribut der neuen Ausnahme angehängt :
>>> try:
... print(1 / 0)
... except:
... raise RuntimeError("Something bad happened")
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ZeroDivisionError: int division or modulo by zero
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
RuntimeError: Something bad happened
Siehe auch die eingebauten Ausnahmen Dokumentation für weitere Einzelheiten über den Kontext und Ursache Informationen zu Ausnahmen angebracht.