Verstehen der NameError- und UnboundLocalError-Probleme mit benannten Ausnahmen
In Python 2.x hat das folgende Codefragment den Wert der benannten Ausnahmen entsprechend gedruckt Ausnahme, exc, außerhalb des Ausnahmeblocks:
<code class="python">exc = None try: raise Exception except Exception as exc: pass print(exc)</code>
In Python 3.x führt der Versuch desselben Codes jedoch zu einem NameError (oder UnboundLocalError in einem Funktionskontext). Um dieses Problem zu beheben, ist es wichtig, die Gründe für das aktualisierte Verhalten von Python zu verstehen.
Python 3.x-Ausnahmebereich und -Bereinigung
Die außer-Anweisung in Python 3.x schränkt den Umfang der gebundenen Ausnahme explizit ein, um Zirkelverweise und vorzeitige Speicherbereinigung zu verhindern. Wenn eine Ausnahme mithilfe der As-Syntax zugewiesen wird, wird sie am Ende der Except-Klausel gelöscht. Dies macht es erforderlich, der Ausnahme für den weiteren Zugriff einen anderen Namen außerhalb des Ausnahmeblocks zuzuweisen.
Eine einfache Neuzuweisung von exc = exc reicht nicht aus, da die Ausnahmeklausel keinen neuen Bereich erstellt. Stattdessen wird der in der Ausnahmezuweisung angegebene Name aus der aktuellen entfernt.
Historischer Kontext und Python 2.x-Verhalten
In Python 2.x gab es Ausnahmen keinen Verweis auf den Traceback besitzen, sodass keine so strenge Bereinigung wie in Python 3.x erforderlich ist. Durch das Fehlen von Zirkelverweisen konnten Ausnahmen an benannte Variablen außerhalb des Except-Blocks gebunden werden, ohne dass es zu Problemen kam.
Empfehlungen für den Umgang mit Ausnahmen
Um Ausnahmen in Python 3 effektiv zu behandeln .x werden die folgenden Richtlinien empfohlen:
Der folgende Code veranschaulicht diese Empfehlungen:
<code class="python">try: raise Exception("foo") except Exception as e: exc = e # Bind to a new variable exc.__traceback__ = None # Explicitly clear traceback</code>
Durch die Einhaltung dieser Vorgehensweisen können Sie Ausnahmen in Python 3.x sicher behandeln und darauf zugreifen und dabei Fallstricke vermeiden gestellt durch NameError und UnboundLocalError.
Das obige ist der detaillierte Inhalt vonWarum erhalte ich NameError oder UnboundLocalError bei der Behandlung von Ausnahmen in Python 3.x?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!