Comment gérer AssertionError en Python et savoir sur quelle ligne ou instruction il s'est produit?

Je veux gérer AssertionErrors à 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.

37
demandé sur Steven Vascellaro 2012-07-21 01:34:41

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)
51
répondu phihag 2015-02-10 14:46:27

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)
9
répondu notpeter 2017-08-17 09:10:13