Was ist der Unterschied zwischen raise
und raise from
in Python?
try:
raise ValueError
except Exception as e:
raise IndexError
was ergibt
Traceback (most recent call last):
File "tmp.py", line 2, in <module>
raise ValueError
ValueError
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "tmp.py", line 4, in <module>
raise IndexError
IndexError
und
try:
raise ValueError
except Exception as e:
raise IndexError from e
was ergibt
Traceback (most recent call last):
File "tmp.py", line 2, in <module>
raise ValueError
ValueError
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "tmp.py", line 4, in <module>
raise IndexError from e
IndexError
python
python-3.x
syntax
exception-handling
Darkfeline
quelle
quelle
raise IndexError from None
sagen wir.raise IndexError from False
wirft einTypeError
, nicht einIndexError
. Meinen Tag gerettet.Antworten:
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 esraise
in einem Ausnahmebehandler verwendet haben. Wenn Sieraise
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__
zuTrue
.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 :Siehe auch die eingebauten Ausnahmen Dokumentation für weitere Einzelheiten über den Kontext und Ursache Informationen zu Ausnahmen angebracht.
quelle
from
und__cause__
anstelle des impliziten zu verketten__context__
? Gibt es Fälle, in denen man eine andere Ausnahme anhängen würde als die, die von der gefangen wurdeexcept
?DatabaseError
wenn das Öffnen der Datenbank fehlschlägt. Wenn der Fehler jedoch darauf zurückzuführen ist,IOError
dass eine Datei nicht geöffnet werden konnte oder eineHTTPError
URL nicht funktioniert hat, möchten Sie diesen Kontext explizit einschließen, damit der Entwickler, der die API verwendet, debuggen kann, warum dies so ist. In diesem Moment verwenden Sieraise DatabaseError from original_exception
.IOError
oderHTTPError
an seine Verbraucher weitergeben möchte, müsste er diese verwendenraise NewException from databaseexception.__cause__
und jetzt eine andere Ausnahme als die verwendenDatabaseException
, die sie gerade abgefangen haben.foo
und eine neue Ausnahme auslösen willstbar
? Dann können Sieraise bar from foo
Python-Status verwenden und haben, derfoo
direkt verursachtbar
. Wenn Sie nicht verwendenfrom foo
, dann druckt Python noch beide, aber fest , dass während der Handhabungfoo
,bar
angehoben wurde , andere Botschaft, sollte einen möglichen Fehler in der Fehlerbehandlung Flagge.