Python の raise と raise ... の違いは何ですか?

不言
リリース: 2018-12-13 11:19:33
転載
7231 人が閲覧しました

この記事がもたらすのは、Python における raise と raise ... の違いについてです。一定の参考値があるので、困っている友人は参考にしていただければ幸いです。

はじめに

Python の raise と raise from の違いは何ですか?

try:
    print(1 / 0)
except Exception as exc:
    raise RuntimeError("Something bad happened")
ログイン後にコピー

出力:

Traceback (most recent call last):
  File "test4.py", line 2, in <module>
    print(1 / 0)
ZeropisionError: pision by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "test4.py", line 4, in <module>
    raise RuntimeError("Something bad happened")
RuntimeError: Something bad happened
ログイン後にコピー

および raise from:

try:
    print(1 / 0)
except Exception as exc:
    raise RuntimeError("Something bad happened") from exc
ログイン後にコピー

出力:

Traceback (most recent call last):
  File "test4.py", line 2, in <module>
    print(1 / 0)
ZeropisionError: pision by zero

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "test4.py", line 4, in <module>
    raise RuntimeError("Something bad happened") from exc
RuntimeError: Something bad happened
ログイン後にコピー

分析

違いは、from は例外オブジェクトの __cause__ 属性を設定して、誰が例外を直接引き起こしたかを示すことです。

例外の処理中に新しい例外が発生します。from を使用しない場合、新しい例外は処理中の例外に関連していない可能性が高くなります。そして、新しい例外が古い例外によって直接引き起こされたことを指摘できます。異常間のこのような相関関係は、その後の異常の分析とトラブルシューティングに役立ちます。 from 構文には制限があります。つまり、2 番目の式は別の例外クラスまたはインスタンスでなければなりません。

例外が例外ハンドラーまたは最終的にブロックでスローされた場合、例外メカニズムはデフォルトで暗黙的に動作し、前の例外を新しい例外の __context__ 属性として追加します。

もちろん、with_traceback() メソッドを使用して例外のコンテキスト __context__ 属性を設定することもできます。これにより、トレースバックで例外情報をより適切に表示することもできます。

raise Exception("foo occurred").with_traceback(tracebackobj)
ログイン後にコピー

例外の関連付けを無効にする

from 特別な使用法もあります: raise ... from None。これは、__suppress_context__ 属性の仕様を設定することで例外の関連付けを明示的に禁止します。 ##

try:
    print(1 / 0)
except Exception as exc:
    raise RuntimeError("Something bad happened") from None
ログイン後にコピー
出力:

Traceback (most recent call last):
  File "test4.py", line 4, in <module>
    raise RuntimeError("Something bad happened") from None
RuntimeError: Something bad happened
ログイン後にコピー

要約

例外が例外ハンドラーまたは最終的にブロックでスローされると、Python は例外のコンテキストを設定します。これは with_traceback () で手動で渡すことができます。そのコンテキストを設定するか、from を通じて例外の原因となったユーザーを指定します。これらのメソッドはすべて、より分かりやすい例外トレースバック情報を取得し、明確な例外コンテキストを出力するためのものです。コンテキストを無視するには、 None から ... を発生させることで、例外コンテキストの自動表示を無効にできます。

以上がPython の raise と raise ... の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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