Я понимаю, что этот вопрос уже давно существует, но как только вам посчастливится поддерживать только 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__
исключения, которое они перехватывают.
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
Обратите внимание, что нижнее исключение содержит строку, в которой мы выполнили недопустимое деление, а такжелиния, где мы переоцениваем исключение.