web-dev-qa-db-fra.com

Comment se connecter python?

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.

63
Maxim Veksler

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.

58
Ben Hoyt

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.

105
rlotun

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
51
NeilenMarais

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)
13
yurez

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
5
erickrf