Si vous avez la chance de ne supporter que python 3.x, cela devient vraiment une chose de beauté :)
augmenter de
Nous pouvons enchaîner les exceptions en utilisant relancer de .
try:
1 / 0
except ZeroDivisionError as e:
raise Exception('Smelly socks') from e
Dans ce cas, l'exception que votre appelant attraperait a le numéro de ligne de l'endroit où nous levons notre exception.
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
Notez que l'exception du bas n'a que le stacktrace à partir duquel nous avons levé notre exception. Votre appelant peut toujours obtenir l'exception d'origine en accédant à l' __cause__
attribut de l'exception qu'il détecte.
with_traceback
Ou vous pouvez utiliser with_traceback .
try:
1 / 0
except ZeroDivisionError as e:
raise Exception('Smelly socks').with_traceback(e.__traceback__)
En utilisant ce formulaire, l'exception que votre appelant attraperait a le traçage à partir de l'endroit où l'erreur d'origine s'est produite.
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
Notez que l'exception du bas a la ligne où nous avons effectué la division invalide ainsi que la ligne où nous relançons l'exception.