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?
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.
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? )
é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.
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.
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.stderr
par 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.
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'