Ausnahmebereich und Zuweisen gebundener Ausnahmen in Python
In Python ist es wichtig, den Umfang benannter Ausnahmen nach Abschluss des Except-Blocks zu verstehen. Dies wird deutlich, wenn man das Verhalten von Python 2.x und 3.x vergleicht.
Python 3.x-Verhalten: NameError und UnboundLocalError
In Python 3.x wird versucht, dies zu tun Der Zugriff auf eine in einem Ausnahmeblock außerhalb dieses Blocks benannte Ausnahme führt entweder zu einem NameError (bei Zugriff außerhalb einer Funktion) oder einem UnboundLocalError (bei Zugriff innerhalb einer Funktion).
Grund für die Änderung
Diese Änderung ist auf die Entscheidung von Python 3.x zurückzuführen, den Umfang benannter Ausnahmen explizit innerhalb der Ausnahmeklausel einzuschränken. Dies dient dazu, Zirkelverweise zu verhindern und die Notwendigkeit zu vermeiden, Tracebacks explizit zu bereinigen.
Problemumgehung
Um auf eine Ausnahme außerhalb des Except-Blocks zuzugreifen, ist es notwendig, sie erneut daran zu binden ein neuer Name. Zum Beispiel:
<code class="python">exc = None try: raise Exception except Exception as exc: exc = exc # Rebinding to a new name</code>
Explizites Traceback-Löschen
Falls gewünscht, ist es möglich, das Traceback nach dem erneuten Binden der Ausnahme explizit zu löschen:
<code class="python">exc = None try: raise Exception("foo") except Exception as e: exc = e exc.__traceback__ = None</code>
Im Gegensatz zu Python 2.x
In Python 2.x enthielten Ausnahmen keine Verweise auf ihren Traceback, daher war diese Bereichseinschränkung nicht erforderlich. Daher hatte die Zuweisung der Ausnahme zu einer Variablen nach dem Except-Block keine negativen Folgen.
Das obige ist der detaillierte Inhalt vonWie unterscheidet sich der Umfang benannter Ausnahmen zwischen Python 2.x und 3.x?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!