Lancer pdb dès qu’une exception a lieu 8
vendredi 10 avril 2015 à 12:08Vous vous souvenez de excepthook et de pdb ?
Mélangeons les deux !
import sys import traceback import pdb def pdb_post_mortem(exc_type, exc_val, exc_tb): # On affiche l'exception histoire de savoir ce qu'on debug print("".join(traceback.format_exception(exc_type, exc_val, exc_tb))) # On balance pdb en mode post mortem, c'est à dire qu'il va se lancer # malgré le fait que le programme ne marche plus, donnant accès # au contexte qu'il y avait juste avant que ça foire pdb.post_mortem(exc_tb) # On dit à python de lancer cette fonction quand il plante sys.excepthook = pdb_post_mortem # On fait planter Python histoire de voir que ça marche bien def boom(): a = 1 b = a / 0 boom() |
Et si quand ça plante, Python nous pond la stack trace, puis nous lance un joli prompt de debugging qui donne accès à ce qu’on avait en mémoire just avant que la VM ne décède :
Traceback (most recent call last): File "test.py", line 16, inboom() File "test.py", line 14, in boom b = a / 0 ZeroDivisionError: integer division or modulo by zero > /home/sam/Bureau/test.py(14)test() -> a = 1 / 0 (Pdb) 1 (Pdb) print a 1
C’est plus ou moins l’équivalent de lancer son programme manuellement avec :
python -m pdb programme.py |
L’avantage de la première forme, c’est qu’on peut le setter et l’oublier, on faire une config un peu plus custom. L’avantage de la deuxième forme, c’est que c’est juste une ligne à taper, et en prime si on fait c
, le programme redémarre automatiquement.