Except ブロックを超えて名前付き例外にアクセスする
Python 3 では、Exception ブロックの外側で名前付き例外を使用しようとすると、通常、NameError またはUnboundLocalError。 Python 2 とは異なり、Python 3 の例外にはトレースバックへの参照があり、例外句内のスコープ制限が生じます。
説明
try ステートメントは、明示的にバインドされた例外のスコープを変更して、循環参照と潜在的なメモリ リークを防ぎます。 as を使用して例外に名前が割り当てられている場合、例外は句の最後でクリアされます。これは、後で例外を参照するには、別の名前にバインドする必要があることを意味します。
回避策
Python 3 では例外のスコープが明確になっているため、主に 2 つの例外があります。例外ブロックを超えて例外にアクセスするアプローチ:
新しい名前へのバインド: 例外を同じ変数に割り当てる代わりに、例外を新しい名前にバインドします。例外句の終了:
<code class="python">try: raise Exception("Custom Error") except Exception as e: new_exc = e print(new_exc)</code>
トレースバックのクリア: 例外が必要ない場合は、メモリ リークを防ぐためにそのトレースバックを明示的にクリアできます:
<code class="python">try: raise Exception("Custom Error") except Exception as e: e.__traceback__ = None print(e)</code>
履歴コンテキスト
Python 2 では、例外はトレースバックを参照しなかったため、スコープの制限は不要でした。その結果、潜在的なリソース リークに対処するために、Python 3 ではこの動作が変更されました。
注意
例外を新しい名前にバインドするときは、次のことを覚えておくことが重要です。元の例外は、Exception 節の終わりでクリアされます。例外をそれ自体に割り当て直すと (例: exc = exc)、新しいバインディングは作成されず、NameError が発生します。
以上がPython 3 の「例外」ブロックの外側にある名前付き例外にアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。