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 サイトの他の関連記事を参照してください。