web-dev-qa-db-fra.com

e.printStackTrace équivalent en python

Je sais que print(e) (où e est une exception) affiche l'exception qui s'est produite, mais j'essayais de trouver l'équivalent python de la fonction e.printStackTrace() de Java qui trace exactement l'exception à quelle ligne elle s'est produite et affiche la trace complète de il.

Quelqu'un pourrait-il me dire s'il vous plaît l'équivalent de e.printStackTrace() en Python?

189
koool
import traceback
traceback.print_exc()

Lorsque vous faites cela dans un bloc except ...:, il utilisera automatiquement l'exception actuelle. Voir http://docs.python.org/library/traceback.html pour plus d'informations.

264
ThiefMaster

Il y a aussi logging.exception.

import logging

...

try:
    g()
except Exception as ex:
    logging.exception("Something awful happened!")
    # will print this message followed by traceback

Sortie:

ERROR 2007-09-18 23:30:19,913 error 1294 Something awful happened!
Traceback (most recent call last):
  File "b.py", line 22, in f
    g()
  File "b.py", line 14, in g
    1/0
ZeroDivisionError: integer division or modulo by zero

(De http://blog.tplus1.com/index.php/2007/09/28/the-python-logging-module-is-much-better-than-print-statements/ via Comment imprimer le suivi complet sans arrêter le programme? )

106
david.libremone

équivalent e.printStackTrace en python

En Java, ceci fait ce qui suit ( docs ):

public void printStackTrace()

Imprime ce jetable et sa trace au flux d'erreur standard ...

Ceci est utilisé comme ceci:

try
{ 
// code that may raise an error
}
catch (IOException e)
{
// exception handling
e.printStackTrace();
}

En Java, , le flux d'erreur standard n'est pas mis en tampon, de sorte que la sortie arrive immédiatement.

La même sémantique dans Python 2 est la suivante:

import traceback
import sys
try: # code that may raise an error
    pass 
except IOError as e: # exception handling
    # in Python 2, stderr is also unbuffered
    print >> sys.stderr, traceback.format_exc()
    # in Python 2, you can also from __future__ import print_function
    print(traceback.format_exc(), file=sys.stderr)
    # or as the top answer here demonstrates, use:
    traceback.print_exc()
    # which also uses stderr.

Python 3

Dans Python 3, nous pouvons obtenir le suivi directement à partir de l'objet exception (qui se comporte probablement mieux pour le code threadé). En outre, stderr est protégé par une ligne , mais la fonction print obtient un argument de vidage qui sera immédiatement imprimé sur stderr:

    print(traceback.format_exception(None, # <- type(e) by docs, but ignored 
                                     e, e.__traceback__),
          file=sys.stderr, flush=True)

Conclusion:

Par conséquent, dans Python 3, traceback.print_exc(), bien qu'il utilise sys.stderrpar défaut , mettrait la sortie en mémoire tampon et pourrait éventuellement la perdre. Donc, pour obtenir la sémantique la plus équivalente possible, utilisez print avec flush=True dans Python 3.

16
Aaron Hall

En ajoutant aux autres bonnes réponses, nous pouvons utiliser les méthodes Python logging de la bibliothèque debug(), info(), warning(), error() et critical(). Citant à partir de la documentation pour Python 3.7.4 ,

Les arguments de mot clé dans kwargs qui sont inspectés sont: exc_info qui, s'il n'est pas évalué comme faux, entraîne l'ajout d'informations d'exception au message de journalisation.

Cela signifie que vous pouvez utiliser la bibliothèque Python logging pour générer un debug(), ou un autre type de message, et la bibliothèque logging inclura la trace de pile dans sa sortie. Dans cet esprit, nous pouvons faire ce qui suit:

import logging

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

def f():
    a = { 'foo': None }
    # the following line will raise KeyError
    b = a['bar']

def g():
    f()

try:
    g()
except Exception as e:
    logger.error(str(e), exc_info=True)

Et cela produira:

'bar'
Traceback (most recent call last):
  File "<ipython-input-2-8ae09e08766b>", line 18, in <module>
    g()
  File "<ipython-input-2-8ae09e08766b>", line 14, in g
    f()
  File "<ipython-input-2-8ae09e08766b>", line 10, in f
    b = a['bar']
KeyError: 'bar'
0
MikeyE