Jeśli masz szczęście, że obsługujesz tylko Pythona 3.x, to naprawdę staje się piękna :)
podnieść z
Możemy połączyć wyjątki za pomocą funkcji raise from .
try:
1 / 0
except ZeroDivisionError as e:
raise Exception('Smelly socks') from e
W tym przypadku wyjątek, który przechwyciłby Twój rozmówca, ma numer wiersza miejsca, w którym zgłosiliśmy wyjątek.
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
Zwróć uwagę, że dolny wyjątek ma tylko ślad stosu, z którego wywołaliśmy nasz wyjątek. Wzywający może nadal uzyskać oryginalny wyjątek, uzyskując dostęp do __cause__
atrybutu wychwyconego wyjątku.
with_traceback
Lub możesz użyć with_traceback .
try:
1 / 0
except ZeroDivisionError as e:
raise Exception('Smelly socks').with_traceback(e.__traceback__)
Korzystając z tego formularza, wyjątek, który Twój wywołujący mógłby złapać, ma śledzenie, z którego wystąpił pierwotny błąd.
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
Zwróć uwagę, że dolny wyjątek zawiera wiersz, w którym wykonaliśmy nieprawidłowy podział, a także wiersz, w którym ponownie podniesiono wyjątek.