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