try
私のコードには次のブロックがあります:
try:
do_something_that_might_raise_an_exception()
except ValueError as err:
errmsg = 'My custom error message.'
raise ValueError(errmsg)
厳密に言えば、実際にはによってスローされるではなく、別の を発生させています。この場合は と呼ばれます。 にカスタム メッセージを添付するにはどうすればよいですか? 次のコードを試しましたが、のインスタンスである が呼び出し可能ではないため失敗します。ValueError
ValueError
do_something...()
err
err
err
ValueError
try:
do_something_that_might_raise_an_exception()
except ValueError as err:
errmsg = 'My custom error message.'
raise err(errmsg)
ベストアンサー1
幸運にも Python 3.x のみをサポートしていれば、これは本当に素晴らしいものになります :)
上げる
例外を連鎖させるには上げる。
try:
1 / 0
except ZeroDivisionError as e:
raise Exception('Smelly socks') from e
この場合、呼び出し元がキャッチする例外には、例外を発生させる場所の行番号が含まれます。
Traceback (most recent call last):
File "test.py", line 2, in <module>
1 / 0
ZeroDivisionError: division by zero
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "test.py", line 4, in <module>
raise Exception('Smelly socks') from e
Exception: Smelly socks
一番下の例外には、例外を発生させた場所からのスタック トレースのみが含まれていることに注意してください。呼び出し元は、__cause__
キャッチした例外の属性にアクセスすることで、元の例外を取得できます。
トレースバックあり
または、トレースバックあり。
try:
1 / 0
except ZeroDivisionError as e:
raise Exception('Smelly socks').with_traceback(e.__traceback__)
この形式を使用すると、呼び出し元がキャッチする例外には、元のエラーが発生した場所からのトレースバックが含まれます。
Traceback (most recent call last):
File "test.py", line 2, in <module>
1 / 0
ZeroDivisionError: division by zero
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "test.py", line 4, in <module>
raise Exception('Smelly socks').with_traceback(e.__traceback__)
File "test.py", line 2, in <module>
1 / 0
Exception: Smelly socks
一番下の例外には、無効な除算を実行した行と例外を再度発生させた行があることに注目してください。