178 votes

Comment enregistrer les valeurs traceback / sys.exc_info () dans une variable?

Je veux enregistrer le nom de l'erreur et les détails de la trace dans une variable.

 import sys
try:
    try:
        print x
    except Exception, ex:
        raise NameError
except Exception, er:
    print "0", sys.exc_info()[0]
    print "1", sys.exc_info()[1]
    print "2", sys.exc_info()[2]
 

Sortie Obtenir:

 0 <type 'exceptions.NameError'>
1 
2 <traceback object at 0xbd5fc8>
 

Sortie recherchée:

 0 NameError
1
2 Traceback (most recent call last):
  File "exception.py", line 6, in <module>
    raise NameError
 

Aidez-moi..

p, s: je sais que cela peut être fait facilement en utilisant le module traceback, mais je veux savoir comment utiliser l'objet sys.exc_info () [2] ici ..

251voto

mac Points 16282

Voici comment je le fais:

 >>> import traceback
>>> try:
...   int('k')
... except:
...   var = traceback.format_exc()
... 
>>> print var
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ValueError: invalid literal for int() with base 10: 'k'
 

Cependant, vous devriez jeter un coup d'œil à la documentation de traceback , car vous y trouverez peut-être des méthodes plus appropriées, en fonction de la manière dont vous souhaitez traiter votre variable par la suite ...

31voto

Nathan Points 667

Utiliser traceback.extract_stack() si vous voulez un accès pratique à de module et fonction des noms et des numéros de ligne.

Utiliser ''.join(traceback.format_stack()) si vous voulez juste une chaîne qui ressemble à de la traceback.print_stack() de la production.

Remarquez que même avec ''.join() , vous obtiendrez un multi-ligne de chaîne, depuis les éléments d' format_stack() contiennent \n. Voir sortie ci-dessous.

N'oubliez pas de import traceback.

Voici la sortie d' traceback.extract_stack(). Mise en forme ajoutés pour des raisons de lisibilité.

>>> traceback.extract_stack()
[
   ('<string>', 1, '<module>', None),
   ('C:\\Python\\lib\\idlelib\\run.py', 126, 'main', 'ret = method(*args, **kwargs)'),
   ('C:\\Python\\lib\\idlelib\\run.py', 353, 'runcode', 'exec(code, self.locals)'),
   ('<pyshell#1>', 1, '<module>', None)
]

Voici la sortie d' ''.join(traceback.format_stack()). Mise en forme ajoutés pour des raisons de lisibilité.

>>> ''.join(traceback.format_stack())
'  File "<string>", line 1, in <module>\n
   File "C:\\Python\\lib\\idlelib\\run.py", line 126, in main\n
       ret = method(*args, **kwargs)\n
   File "C:\\Python\\lib\\idlelib\\run.py", line 353, in runcode\n
       exec(code, self.locals)\n  File "<pyshell#2>", line 1, in <module>\n'

0voto

Python Larry Points 374

Ma réponse à une autre question peut aider à illustrer les détails - avec des liens! Pour les chaînes prêtes à l'emploi, le module de traceback de bibliothèque standard semble correct. Si vous souhaitez obtenir les détails, lisez le source ( <python install path>/Lib/traceback.py ) pour plus d’informations.

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