Se sei abbastanza fortunato da supportare solo Python 3.x, questo diventa davvero una cosa di bellezza :)
sollevare da
Siamo in grado di concatenare le eccezioni utilizzando raise da .
try:
1 / 0
except ZeroDivisionError as e:
raise Exception('Smelly socks') from e
In questo caso, l'eccezione rilevata dal chiamante ha il numero di linea del luogo in cui viene sollevata la nostra eccezione.
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
Si noti che l'eccezione inferiore ha solo lo stacktrace da cui è stata sollevata la nostra eccezione. Il chiamante potrebbe comunque ottenere l'eccezione originale accedendo __cause__
all'attributo dell'eccezione rilevata.
with_traceback
Oppure puoi usare with_traceback .
try:
1 / 0
except ZeroDivisionError as e:
raise Exception('Smelly socks').with_traceback(e.__traceback__)
Utilizzando questo modulo, l'eccezione rilevata dal chiamante ha il traceback dal punto in cui si è verificato l'errore originale.
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
Si noti che l'eccezione in basso ha la riga in cui è stata eseguita la divisione non valida nonché la riga in cui è stata effettuata la re-inizializzazione dell'eccezione.