In diesem Artikel geht es um den Unterschied zwischen „raise“ und „raise ...“ in Python? Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird Ihnen hilfreich sein.
Erste Schritte
Was ist der Unterschied zwischen raise und raise from in Python?
try: print(1 / 0) except Exception as exc: raise RuntimeError("Something bad happened")
Ausgabe:
Traceback (most recent call last): File "test4.py", line 2, in <module> print(1 / 0) ZeropisionError: pision by zero During handling of the above exception, another exception occurred: Traceback (most recent call last): File "test4.py", line 4, in <module> raise RuntimeError("Something bad happened") RuntimeError: Something bad happened
Und raise from
:
try: print(1 / 0) except Exception as exc: raise RuntimeError("Something bad happened") from exc
Ausgabe:
Traceback (most recent call last): File "test4.py", line 2, in <module> print(1 / 0) ZeropisionError: pision by zero The above exception was the direct cause of the following exception: Traceback (most recent call last): File "test4.py", line 4, in <module> raise RuntimeError("Something bad happened") from exc RuntimeError: Something bad happened
Analyse
Der Unterschied besteht darin, dass from das Attribut __cause__ für das Ausnahmeobjekt festlegt, um anzugeben, wer die Ausnahme direkt verursacht hat.
Bei der Behandlung der Ausnahme ist eine neue Ausnahme aufgetreten. Wenn „from“ nicht verwendet wird, ist es wahrscheinlicher, dass die neue Ausnahme nicht mit der behandelten Ausnahme zusammenhängt. Und von kann darauf hingewiesen werden, dass die neue Ausnahme direkt durch die alte Ausnahme verursacht wird. Solche Korrelationen zwischen Anomalien sind hilfreich für die anschließende Analyse und Fehlerbehebung von Anomalien. Es gibt eine Einschränkung in der From-Syntax, das heißt, der zweite Ausdruck muss eine andere Ausnahmeklasse oder Instanz sein.
Wenn eine Ausnahme innerhalb eines Ausnahmehandlers oder eines Final-Blocks ausgelöst wird, funktioniert der Ausnahmemechanismus standardmäßig implizit, indem die vorherige Ausnahme als __context__-Attribut der neuen Ausnahme angehängt wird.
Natürlich können Sie das Attribut context __context__ für Ausnahmen auch über die Methode with_traceback() festlegen, wodurch auch Ausnahmeinformationen im Traceback besser angezeigt werden können.
raise Exception("foo occurred").with_traceback(tracebackobj)
Ausnahmezuordnung verbieten
von Es gibt auch eine spezielle Verwendung: raise ... from None, die die Ausnahmezuordnung durch Festlegen der Attributspezifikation __suppress_context__ explizit verbietet:
try: print(1 / 0) except Exception as exc: raise RuntimeError("Something bad happened") from None
Ausgabe:
Traceback (most recent call last): File "test4.py", line 4, in <module> raise RuntimeError("Something bad happened") from None RuntimeError: Something bad happened
Zusammenfassung
Wenn eine Ausnahme in einem Ausnahmehandler oder Finalblock ausgelöst wird, legt Python den Kontext für die Ausnahme fest. Dies kann manuell übergeben werden with_traceback () Legen Sie den Kontext fest oder geben Sie an, wer die Ausnahme verursacht hat von. Diese Methoden dienen alle dazu, benutzerfreundlichere Ausnahme-Traceback-Informationen zu erhalten und einen klaren Ausnahmekontext auszudrucken. Um den Kontext zu ignorieren, können Sie die automatische Anzeige des Ausnahmekontexts deaktivieren, indem Sie ... von None auslösen.
Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen raise und raise ... from in Python?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!