Der Unterschied besteht darin, dass bei Verwendung fromdas __cause__Attribut festgelegt wird und die Nachricht angibt, dass die Ausnahme direkt durch verursacht wurde . Wenn Sie das weglassen, fromwird 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 raisein einem Ausnahmebehandler verwendet haben. Wenn Sie raiseirgendwo anders verwendet haben, ist auch nein __context__eingestellt.
Wenn a __cause__gesetzt ist, __suppress_context__ = Truewird auch für die Ausnahme ein Flag gesetzt. Wenn auf __suppress_context__gesetzt, Truewird 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 Noneum 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 Nonekönnen Sie den zu druckenden Kontext unterdrücken.
Siehe die raiseErklärung Dokumentation :
Die fromKlausel 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 finallyKlausel 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.