名前付き例外に関する NameError および UnboundLocalError の問題を理解する
Python 2.x では、以下のコード スニペットは名前付き例外の値を適切に出力しました。例外、exc、例外ブロックの外側:
<code class="python">exc = None try: raise Exception except Exception as exc: pass print(exc)</code>
ただし、Python 3.x では、同じコードを試行すると NameError (または関数コンテキストでは UnboundLocalError) が発生します。この問題を修正するには、Python の更新された動作の背後にある理論的根拠を理解することが不可欠です。
Python 3.x 例外のスコープとクリーンアップ
Python 3.x の例外ステートメント循環参照や早期のガベージ コレクションを防ぐために、バインドされた例外のスコープを明示的に制限します。 as 構文を使用して例外を割り当てると、例外は、Exception 句の最後でクリアされます。これには、さらにアクセスするために、例外を、Exception ブロックの外側の別の名前に割り当てる必要があります。
exc = exc を再割り当てするだけでは十分ではありません。Except 句は新しいスコープを作成しないからです。代わりに、例外の割り当てで指定された名前が現在の名前から削除されます。
歴史的コンテキストと Python 2.x の動作
Python 2.x では、例外は削除されました。トレースバックへの参照を持たないため、Python 3.x のような厳密なクリーンアップの必要がなくなります。循環参照がないため、例外は問題を引き起こすことなく、Exception ブロックの外側の名前付き変数にバインドできました。
例外処理に関する推奨事項
Python 3 で例外を効果的に処理するには.x では、次のガイドラインが推奨されます。
次のコードは、これらの推奨事項を例示しています:
<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>
これらのプラクティスに従うことで、Python 3.x で自信を持って例外を処理し、例外にアクセスでき、落とし穴を回避できます。 NameError と UnboundLocalError によって引き起こされます。
以上がPython 3.x で例外を処理するときに NameError または UnboundLocalError が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。