web-dev-qa-db-fra.com

Masquer traceback sauf si un indicateur de débogage est défini

Quelle est la manière idiomatique python de masquer les erreurs de trace sauf si un indicateur détaillé ou de débogage est défini?

Exemple de code:

their_md5 = 'c38f03d2b7160f891fc36ec776ca4685'
my_md5 = 'c64e53bbb108a1c65e31eb4d1bb8e3b7' 
if their_md5 != my_md5:
    raise ValueError('md5 sum does not match!')

Sortie existante maintenant, mais uniquement souhaitée lorsqu'elle est appelée avec foo.py --debug:

Traceback (most recent call last):
  File "b:\code\apt\apt.py", line 1647, in <module>
    __main__.__dict__[command] (packages)
  File "b:\code\apt\apt.py", line 399, in md5
    raise ValueError('md5 sum does not match!')
ValueError: md5 sum does not match!

Sortie normale souhaitée:

ValueError: md5 sum does not match!

Voici un script de test: https://Gist.github.com/maphew/e3a75c147cca98019cd8

38
matt wilkie

La méthode la plus courte consiste à utiliser le module sys et à utiliser cette commande:

sys.tracebacklimit = 0

Utilisez votre indicateur pour déterminer le comportement.

Exemple:

>>> import sys
>>> sys.tracebacklimit=0
>>> int('a')
ValueError: invalid literal for int() with base 10: 'a'

La meilleure façon est d'utiliser et crochet d'exception :

def exception_handler(exception_type, exception, traceback):
    # All your trace are belong to us!
    # your format
    print "%s: %s" % (exception_type.__name__, exception)

sys.excepthook = exception_handler

Modifier:

Si vous avez toujours besoin de retomber sur le crochet d'origine:

def exception_handler(exception_type, exception, traceback, debug_hook=sys.excepthook):
    if _your_debug_flag_here:
        debug_hook(exception_type, exception, traceback)
    else:
        print "%s: %s" % (exception_type.__name__, exception)

Vous pouvez maintenant passer un hook de débogage au gestionnaire, mais vous voudrez probablement toujours utiliser celui originaire de sys.excepthook (alors ne passez rien dans debug_hook). Python lie les arguments par défaut une fois en temps de définition (piège commun ...) ce qui fait que cela fonctionne toujours avec le même gestionnaire d'origine, avant remplacé.

53
Reut Sharabani
try:
    pass # Your code here
except Exception as e:
    if debug:
        raise # re-raise the exception
              # traceback gets printed
    else:
        print("{}: {}".format(type(e).__name__, e))
4
GingerPlusPlus