ホームページ  >  記事  >  バックエンド開発  >  Python の raise と raise ... の違いは何ですか?

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

不言
不言転載
2018-12-13 11:19:337216ブラウズ

この記事がもたらすのは、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 までご連絡ください。