[解決済み] Pythonの例外の連鎖 [重複]について
2023-03-21 11:57:48
質問
Pythonで例外の連鎖を使う標準的な方法はあるのでしょうか? Java の例外 'caused by' のような?
ここにいくつかの背景があります。
1つのメインの例外クラスがあるモジュールを持っています
DSError
:
class DSError(Exception):
pass
このモジュール内のどこかに
try:
v = my_dict[k]
something(v)
except KeyError as e:
raise DSError("no key %s found for %s" % (k, self))
except ValueError as e:
raise DSError("Bad Value %s found for %s" % (v, self))
except DSError as e:
raise DSError("%s raised in %s" % (e, self))
基本的にこのスニペットはDSErrorだけを投げて、何が起こったのか、なぜ起こったのかを教えてくれるはずです。 しかし、tryブロックは他の例外をたくさん投げるかもしれないので、次のようなことができればと思います。
try:
v = my_dict[k]
something(v)
except Exception as e:
raise DSError(self, v, e) # Exception chained...
これはPythonの標準的な方法ですか? 他のモジュールでは例外チェインを見かけなかったので、Pythonではどのように行われているのでしょうか?
どのように解決するのですか?
例外の連鎖 は、Python 3 でしか書けません。
try:
v = {}['a']
except KeyError as e:
raise ValueError('failed') from e
のような出力が得られます。
Traceback (most recent call last):
File "t.py", line 2, in <module>
v = {}['a']
KeyError: 'a'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "t.py", line 4, in <module>
raise ValueError('failed') from e
ValueError: failed
たいていの場合、このように
from
Python 3 はデフォルトで、例外処理中に発生したすべての例外をこのように表示します。
Traceback (most recent call last):
File "t.py", line 2, in <module>
v = {}['a']
KeyError: 'a'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "t.py", line 4, in <module>
raise ValueError('failed')
ValueError: failed
でできること Python 2 のように、例外クラスにカスタム属性を追加することです。
class MyError(Exception):
def __init__(self, message, cause):
super(MyError, self).__init__(message + u', caused by ' + repr(cause))
self.cause = cause
try:
v = {}['a']
except KeyError as e:
raise MyError('failed', e)
関連
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み] JUnit 4のテストで、ある例外が投げられたことをどのように断言しますか?
-
[解決済み] Pythonのwith文の使用中に例外をキャッチする
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】例外の説明と例外を発生させたスタックトレースを文字列で取得する。
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] PySparkでデータフレームのカラムをString型からDouble型に変更する方法は?
最新
-
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で "内部例外"(トレースバック付き)?
-
[解決済み] SQLAlchemy: セッションの作成と再利用
-
[解決済み] Pythonのキャッシュライブラリはありますか?
-
[解決済み] バブルソートの宿題
-
[解決済み] SQLAlchemy: 日付フィールドをフィルタリングする方法は?
-
[解決済み] Django Rest Framework ファイルアップロード
-
[解決済み] Pythonで0xを使わずにhex()を使うには?
-
[解決済み] SQLAlchemy - テーブルのリストを取得する
-
[解決済み] Pythonで、ウェブサイトが404か200かを確認するためにurllibをどのように使用しますか?
-
[解決済み] Pythonの辞書にあるスレッドセーフについて