Comment gérer AssertionError en Python et savoir sur quelle ligne ou instruction il s'est produit?
Je veux gérer AssertionError
s à la fois de cacher les parties inutiles de la trace de la pile de l'utilisateur et d'imprimer un message pourquoi l'erreur s'est produite et que l'utilisateur doit faire à ce sujet.
Existe-t-il un moyen de savoir sur quelle ligne ou Instruction le assert
a échoué dans le bloc except
?
try:
assert True
assert 7 == 7
assert 1 == 2
# many more statements like this
except AssertionError:
print 'Houston, we have a problem.'
print
print 'An error occurred on line ???? in statement ???'
exit(1)
Je ne veux pas avoir à ajouter ceci à chaque déclaration assert:
assert 7 == 7, "7 == 7"
Parce qu'il répète des informations.
2 réponses
Utiliser le l'exī module:
import sys
import traceback
try:
assert True
assert 7 == 7
assert 1 == 2
# many more statements like this
except AssertionError:
_, _, tb = sys.exc_info()
traceback.print_tb(tb) # Fixed format
tb_info = traceback.extract_tb(tb)
filename, line, func, text = tb_info[-1]
print('An error occurred on line {} in statement {}'.format(line, text))
exit(1)
Le module traceback et sys.exc_info sont exagérés pour traquer la source d'une exception. C'est tout dans le traceback par défaut. Donc, au lieu d'appeler exit (1), relancez simplement:
try:
assert "birthday cake" == "ice cream cake", "Should've asked for pie"
except AssertionError:
print 'Houston, we have a problem.'
raise
Qui donne la sortie suivante qui inclut l'instruction incriminée et le numéro de ligne:
Houston, we have a problem.
Traceback (most recent call last):
File "/tmp/poop.py", line 2, in <module>
assert "birthday cake" == "ice cream cake", "Should've asked for pie"
AssertionError: Should've asked for pie
De même, le module de journalisation permet de consigner facilement un retraçage pour toute exception (y compris celles qui sont interceptées et ne sont jamais relancées):
import logging
try:
assert False == True
except AssertionError:
logging.error("Nothing is real but I can't quit...", exc_info=True)