Comment puis-je enregistrer une exception en Python?
J'ai examiné certaines options et découvert que je peux accéder aux détails de l'exception réelle à l'aide de ce code:
import sys
import traceback
try:
1/0
except:
exc_type, exc_value, exc_traceback = sys.exc_info()
traceback.print_exception(exc_type, exc_value, exc_traceback)
Je voudrais en quelque sorte obtenir la chaîne print_exception()
jette vers stdout pour que je puisse la journaliser.
Pour répondre à votre question, vous pouvez obtenir la version chaîne de print_exception()
en utilisant la fonction traceback.format_exception()
. Il renvoie le message de trace sous forme de liste de chaînes plutôt que de l'imprimer sur stdout, vous pouvez donc faire ce que vous voulez avec. Par exemple:
import sys
import traceback
try:
asdf
except NameError:
exc_type, exc_value, exc_traceback = sys.exc_info()
lines = traceback.format_exception(exc_type, exc_value, exc_traceback)
print ''.join('!! ' + line for line in lines) # Log it or whatever here
Cela affiche:
!! Traceback (most recent call last):
!! File "<stdin>", line 2, in <module>
!! NameError: name 'asdf' is not defined
Cependant, je recommanderais certainement d'utiliser le module de journalisation standard Python, comme suggéré par rlotun. Ce n'est pas la chose la plus facile à configurer, mais c'est très personnalisable.
Jeter un coup d'œil à logging.exception
( Module de journalisation Python )
import logging
def foo():
try:
some_code()
except:
logging.exception('')
Cela devrait automatiquement prendre soin de récupérer la trace de l'exception actuelle et de la journaliser correctement.
La journalisation des exceptions est aussi simple que l'ajout de l'argument mot-clé exc_info = True à n'importe quel message de journal, voir l'entrée pour Logger.debug dans http://docs.python.org/2/library/logging.html .
Exemple:
try:
raise Exception('lala')
except Exception:
logging.info('blah', exc_info=True)
sortie (en fonction, bien sûr, de la configuration de votre gestionnaire de journaux):
2012-11-29 10:18:12,778 - root - INFO - <ipython-input-27-5af852892344> : 3 - blah
Traceback (most recent call last):
File "<ipython-input-27-5af852892344>", line 1, in <module>
try: raise Exception('lala')
Exception: lala
Dans Python 3.5 vous pouvez passer l'instance d'exception dans l'argument exc_info:
import logging
try:
1/0
except Exception as e:
logging.error('Error at %s', 'division', exc_info=e)
Tout d'abord, envisagez d'utiliser un type d'exception approprié sur votre clause except. Ensuite, en nommant l'exception, vous pouvez l'imprimer:
try:
1/0
except Exception as e:
print e
En fonction de votre Python, vous devez utiliser
except Exception, e