Якщо вам пощастило підтримувати лише 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
Зауважте, нижній виняток містить рядок, де ми виконували недійсний поділ, а також рядок, де ми повторно оцінюємо виняток.