Heim >Backend-Entwicklung >Python-Tutorial >Was ist der Unterschied zwischen raise und raise ... from in Python?

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

不言
不言nach vorne
2018-12-13 11:19:337271Durchsuche

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen