運が良ければpython 3.xのみをサポートするのであれば、これは本当に美しさになる:)
から上げる
例外を連鎖させることができます raise fromます。
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__
、キャッチした例外の属性にアクセスすることで、元の例外を引き続き取得できます。
with_traceback
または、with_tracebackを使用できます。
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
下の例外には、無効な除算を実行した行と、例外を再発生させた行があります。