Si tienes la suerte de admitir solo Python 3.x, esto realmente se convierte en algo bello :)
elevar desde
Podemos encadenar las excepciones usando raise from .
try:
1 / 0
except ZeroDivisionError as e:
raise Exception('Smelly socks') from e
En este caso, la excepción que detectaría su interlocutor tiene el número de línea del lugar donde planteamos nuestra excepción.
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
Observe que la excepción inferior solo tiene el stacktrace desde donde generamos nuestra excepción. La persona que llama aún puede obtener la excepción original accediendo al __cause__
atributo de la excepción que detecta.
con_traceback
O puede usar with_traceback .
try:
1 / 0
except ZeroDivisionError as e:
raise Exception('Smelly socks').with_traceback(e.__traceback__)
Al usar este formulario, la excepción que su interlocutor detectaría tiene el rastreo desde donde ocurrió el error original.
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
Observe que la excepción inferior tiene la línea donde realizamos la división no válida, así como la línea donde volvemos a plantear la excepción.