ホームページ > バックエンド開発 > Python チュートリアル > Python 3.x で例外を処理するときに NameError または UnboundLocalError が発生するのはなぜですか?

Python 3.x で例外を処理するときに NameError または UnboundLocalError が発生するのはなぜですか?

Susan Sarandon
リリース: 2024-10-29 08:50:30
オリジナル
420 人が閲覧しました

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

名前付き例外に関する 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 では、次のガイドラインが推奨されます。

  1. 例外を、Exception 句の外側の新しい変数にバインドします。
  2. 必要に応じて、トレースバック参照を明示的にクリアして、循環参照を防止し、容易に実行します。

次のコードは、これらの推奨事項を例示しています:

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート