La journalisation les exceptions non traitées en Python
Comment vous causer ce type d'exception à la sortie via le logging
module plutôt que de 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(...)
été invoquée automatiquement chaque fois qu'une exception n'est pas pris.
Vous devez vous connecter pour publier un commentaire.
Que Nie 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 desys.excepthook
à faire ce que vous voulez (y compris à l'aide delogging.exception
).Comme un homme de paille exemple:
Remplacer
sys.excepthook
:Commettre évidente erreur de syntaxe (congé du côlon) et de revenir d'erreur personnalisée de l'information:
Pour plus d'informations sur
sys.excepthook
: http://docs.python.org/library/sys.html#sys.excepthooktype
ne fonctionnerait pas, car c'est un mot clé réservé..?type
comme un argument de fonction, bien que les Ide se plaignent de cacher le mondialtype
(un peu comme en utilisantvar self = this
en Javascript). Il n'a pas vraiment d'importance sauf si vous avez besoin d'accéder à latype
objet à l'intérieur de votre fonction, dans ce cas vous pouvez utilisertype_
comme argument à la place.sys.excepthook
n'est PAS appelée lorsqu'une exception est élevé". Elle est appelée lorsque le programme va mettre fin en raison d'une exception non interceptée, qui ne peut pas se produire plus d'une fois.sys.stderr = io.StringIO("")
mais il ne fonctionne pas.Voici un petit exemple qui comprend aussi quelques autres trucs:
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'objet logger.
logging
intégré kwargexc_info
logger.critical()
à l'intérieur de la excepthook gestionnaire, depuis une exception non interceptée est assez critique, je dirais.logging.basicConfig(level=logging.DEBUG, filename="debug.log", format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
Mais n'a pas aidé.La méthode
sys.excepthook
sera appelé si une exception est interceptée: http://docs.python.org/library/sys.html#sys.excepthooktype
sur l'instance?Pourquoi pas:
Voici la sortie avec
sys.excepthook
comme vu ci-dessus:Voici le résultat avec le
sys.excepthook
commenté:La seule différence est que le premier a
ERROR:root:Unhandled exception:
au début de la première ligne.sys.stderr
.De construire sur Jacinda réponse, mais à l'aide d'un enregistreur de l'objet:
functools.partial()
au lieu de lambda. Voir: docs.python.org/2/library/functools.html#functools.partialEnvelopper votre app de l'entrée dans un appel d'une
try...except
bloc de sorte que vous serez en mesure de les attraper et de les connecter (et peut-être re-raise) toutes les exceptions non traitées. E. g. au lieu de:Ce faire:
Vous pourriez peut-être faire quelque chose pour le haut d'un module qui redirige stderr dans un fichier, puis logg que le fichier en bas
Bien que @gnu_lorien réponse m'a donné un bon point de départ, mon programme se bloque sur la première exception.
Je suis venu avec un sur mesure (et/ou) l'amélioration de la solution, qui se connecte silencieusement Exceptions de fonctions qui sont décorées avec des
@handle_error
.