ホームページ >バックエンド開発 >Python チュートリアル >名前付き例外のスコープは、Python 2.x と 3.x でどのように異なりますか?

名前付き例外のスコープは、Python 2.x と 3.x でどのように異なりますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-29 18:34:54536ブラウズ

How does the scope of named exceptions differ between Python 2.x and 3.x?

Python での例外スコープとバインドされた例外の割り当て

Python では、Except ブロックが終了した後の名前付き例外のスコープを理解することが不可欠です。これは、Python 2.x と 3.x の動作を比較すると明らかです。

Python 3.x の動作: NameError と UnboundLocalError

Python 3.x では、ブロックの外側で、Except ブロックで指定された例外にアクセスすると、NameError (関数の外側でアクセスした場合) または UnboundLocalError (関数の内側でアクセスした場合) が発生します。

変更の理由

この変更は、名前付き例外の範囲を例外句内で明示的に制限するという Python 3.x の決定によるものです。これは、循環参照を防止し、トレースバックを明示的にクリーンアップする必要性を回避するためです。

回避策

例外ブロックの外側で例外にアクセスするには、例外を次のように再バインドする必要があります。新しい名前。例:

<code class="python">exc = None
try:
    raise Exception
except Exception as exc:
    exc = exc # Rebinding to a new name</code>

明示的なトレースバックのクリア

必要に応じて、例外を再バインドした後にトレースバックを明示的にクリアできます:

<code class="python">exc = None
try:
    raise Exception("foo")
except Exception as e:
    exc = e
    exc.__traceback__ = None</code>

Python 2.x との対照

Python 2.x では、例外にトレースバックへの参照が含まれていなかったため、このスコープ制限は必要ありませんでした。結果として、Exception ブロックの後の変数に例外を代入しても、悪影響はありませんでした。

以上が名前付き例外のスコープは、Python 2.x と 3.x でどのように異なりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。