[解決済み】Pythonの "raise from "の使い方
質問
とはどう違うのですか?
raise
と
raise from
をPythonで使うのですか?
try:
raise ValueError
except Exception as e:
raise IndexError
となり、その結果
Traceback (most recent call last):
File "tmp.py", line 2, in <module>
raise ValueError
ValueError
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "tmp.py", line 4, in <module>
raise IndexError
IndexError
そして
try:
raise ValueError
except Exception as e:
raise IndexError from e
となり、その結果
Traceback (most recent call last):
File "tmp.py", line 2, in <module>
raise ValueError
ValueError
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "tmp.py", line 4, in <module>
raise IndexError from e
IndexError
解決方法は?
この違いは
from
は、その
__cause__
属性
が設定され、メッセージには、例外が
直接の原因は
. を省略した場合は
from
を使用すると
__cause__
が設定されますが
__context__
属性
が設定されている場合もあり、その場合、トレースバックではコンテキストが
処理中に別のことが起こった
.
を設定する。
__context__
を使用した場合に発生します。
raise
を例外ハンドラで使用した場合。
raise
それ以外の場所では
__context__
も設定されています。
もし
__cause__
が設定されている場合は
__suppress_context__ = True
フラグも例外に設定されます。
__suppress_context__
に設定されます。
True
を使用する場合、その
__context__
はトレースバックを表示する際に無視されます。
例外ハンドラから発生させる場合
しない
コンテキストを表示したい(たとえば
処理中に別の例外が発生した
メッセージ)を使用する場合は
raise ... from None
を設定します。
__suppress_context__
から
True
.
つまり、Pythonは
コンテキスト
これにより、ある例外が発生した場所をイントロスペクトすることができ、別の例外がその例外に置き換わったかどうかを確認することができます。また
原因
を例外に追加すると、トレースバックに他の例外が明示されます (別の表現を使用します)。また、コンテキストは無視されます (ただし、デバッグ時にイントロスペクトすることは可能です)。使用方法
raise ... from None
を使用すると、コンテキストが表示されないようにすることができます。
を参照してください。
raise
ステートメント・ドキュメンテーション
:
は
from
句は、例外の連鎖に使用されます。 表現 は別の例外クラスまたはインスタンスでなければなりません。__cause__
属性(これは書き込み可能です)を使用します。発生した例外が処理されない場合、両方の例外が出力されます。>>> try: ... print(1 / 0) ... except Exception as exc: ... raise RuntimeError("Something bad happened") from exc ... Traceback (most recent call last): File "<stdin>", line 2, in <module> ZeroDivisionError: int division or modulo by zero The above exception was the direct cause of the following exception: Traceback (most recent call last): File "<stdin>", line 4, in <module> RuntimeError: Something bad happened
同様の仕組みは、例外ハンドラの内部で例外が発生した場合にも暗黙のうちに機能します。
finally
前の例外は、新しい例外の__context__
属性で指定します。>>> try: ... print(1 / 0) ... except: ... raise RuntimeError("Something bad happened") ... Traceback (most recent call last): File "<stdin>", line 2, in <module> ZeroDivisionError: int division or modulo by zero During handling of the above exception, another exception occurred: Traceback (most recent call last): File "<stdin>", line 4, in <module> RuntimeError: Something bad happened
もご覧ください。 組み込みの例外に関する文書 は、例外に付随するコンテキストや原因情報の詳細について説明します。
関連
-
[解決済み】django インポートエラー - core.managementという名前のモジュールがない
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] Pythonの辞書からキーを削除するにはどうしたらいいですか?
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] エラー UnicodeDecodeError: 'utf-8' コーデックが位置 0 のバイト 0xff をデコードできない: 開始バイトが無効です。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ピロウズ画像色処理の具体的な活用方法
-
pythonを使ったオフィス自動化コード例
-
PicgoのイメージベッドツールをPythonで実装する
-
[解決済み】RuntimeWarning: 割り算で無効な値が発生しました。
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み] データ型が理解できない
-
[解決済み】numpy: true_divide で無効な値に遭遇
-
[解決済み】ValueError: pickleプロトコルがサポートされていません。3、python2 pickleはpython3 pickleでダンプしたファイルを読み込むことができない?
-
[解決済み】ValueError: xとyは同じサイズでなければならない
-
[解決済み】Pythonのtry/exceptブロックのネストは良いプログラミングの練習になりますか?