Heim > Backend-Entwicklung > Python-Tutorial > Warum erhalte ich NameError oder UnboundLocalError bei der Behandlung von Ausnahmen in Python 3.x?

Warum erhalte ich NameError oder UnboundLocalError bei der Behandlung von Ausnahmen in Python 3.x?

Susan Sarandon
Freigeben: 2024-10-29 08:50:30
Original
376 Leute haben es durchsucht

Why Do I Get NameError or UnboundLocalError When Handling Exceptions in Python 3.x?

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

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:

  1. Binden Sie die Ausnahme an eine neue Variable außerhalb der Ausnahmeklausel.
  2. Löschen Sie bei Bedarf explizit die Traceback-Referenz, um Zirkelverweise zu verhindern und zu erleichtern Garbage Collection.

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

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!

Quelle:php.cn
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage