212 votes

La journalisation Les Exceptions non traitées en Python

Comment avez-vous provoquer les exceptions à la sortie via l' logging module plutôt que d' stderr?

Je me rends compte que la meilleure façon de le faire serait:

try:
    raise Exception, 'Throwing a boring exception'
except Exception, e:
    logging.exception(e)

mais ma situation est telle qu'il serait vraiment sympa si logging.exception(...) a été invoquée automatiquement chaque fois qu'une exception n'est pas pris.

230voto

gnu_lorien Points 101

Voici un petit exemple qui comprend aussi quelques autres trucs:

import os, sys
import logging
logger = logging.getLogger(__name__)
handler = logging.StreamHandler(stream=sys.stdout)
logger.addHandler(handler)

def handle_exception(exc_type, exc_value, exc_traceback):
    if issubclass(exc_type, KeyboardInterrupt):
        sys.__excepthook__(exc_type, exc_value, exc_traceback)
        return

    logger.error("Uncaught exception", exc_info=(exc_type, exc_value, exc_traceback))

sys.excepthook = handle_exception

if __name__ == "__main__":
    raise RuntimeError("Test unhandled")
  • Ignorer KeyboardInterrupt donc une console python programme peut quitter avec Ctrl + C.

  • Compter entièrement sur python module de journalisation pour la mise en forme de l'exception.

  • Utiliser un enregistreur, un exemple de gestionnaire. Celui-ci change l'exception non gérée à aller vers stdout plutôt que stderr, mais vous pouvez ajouter toutes sortes de gestionnaires dans ce même style à l'enregistreur à l'objet.

158voto

Jacinda Points 1575

Comme Ned l'a souligné, sys.excepthook est invoqué à chaque fois qu'une exception est levée et non interceptée. L'implication pratique de cette est que dans votre code, vous pouvez remplacer le comportement par défaut de sys.excepthook à faire ce que vous voulez (y compris à l'aide de logging.exception).

Comme un homme de paille exemple:

>>> import sys
>>> def foo(exctype, value, tb):
...     print 'My Error Information'
...     print 'Type:', exctype
...     print 'Value:', value
...     print 'Traceback:', tb
... 

Remplacer sys.excepthook:

>>> sys.excepthook = foo

S'engager évidente erreur de syntaxe (congé du côlon) et de revenir personnalisée informations d'erreur:

>>> def bar(a, b)
My Error Information
Type: <type 'exceptions.SyntaxError'>
Value: invalid syntax (<stdin>, line 1)
Traceback: None

Pour plus d'informations sur l' sys.excepthook: http://docs.python.org/library/sys.html#sys.excepthook

30voto

Tiago Coutinho Points 96

Pourquoi pas:

import sys
import logging
import traceback

def log_except_hook(*exc_info):
    text = "".join(traceback.format_exception(*exc_info))
    logging.error("Unhandled exception: %s", text)

sys.excepthook = log_except_hook

27voto

Ned Batchelder Points 128913

La méthode sys.excepthook sera appelé si une exception est interceptée: http://docs.python.org/library/sys.html#sys.excepthook

Lorsqu'une exception est levée et non interceptée, l'interprète des appels sys.excepthook avec trois arguments, à l'exception de la classe, à l'exception de l'instance, et une traçabilité en amont de l'objet. Dans une session interactive de ce qui se passe juste avant le contrôle est retourné à l'invite, dans un programme en Python cela se passe juste avant que le programme se termine. Le traitement de ce type de haut-niveau, des exceptions peuvent être personnalisés par l'attribution d'une autre de trois argument de la fonction sys.excepthook.

8voto

Mike Points 71

Pour construire sur Jacinda réponse, mais à l'aide d'un objet logger:

def catchException(logger, typ, value, traceback):
    logger.critical("My Error Information")
    logger.critical("Type: %s" % typ)
    logger.critical("Value: %s" % value)
    logger.critical("Traceback: %s" % traceback)

# Use a partially applied function
func = lambda typ, value, traceback: catchException(logger, typ, value, traceback)
sys.excepthook = func

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X