Was ist der Unterschied zwischen raise und raise ... from in Python?

不言
Freigeben: 2018-12-13 11:19:33
nach vorne
7234 Leute haben es durchsucht

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")
Nach dem Login kopieren

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
Nach dem Login kopieren

Und raise from:

try:
    print(1 / 0)
except Exception as exc:
    raise RuntimeError("Something bad happened") from exc
Nach dem Login kopieren

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
Nach dem Login kopieren

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)
Nach dem Login kopieren

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
Nach dem Login kopieren

Ausgabe:

Traceback (most recent call last):
  File "test4.py", line 4, in <module>
    raise RuntimeError("Something bad happened") from None
RuntimeError: Something bad happened
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage