Équivalent e.printStackTrace en python
En Java, cela fait les choses suivantes ( docs ):
public void printStackTrace()
Imprime ce jetable et sa trace dans le 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 mémoire tampon de sorte que la sortie arrive immédiatement.
La même sémantique en Python 2 est:
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
En Python 3, nous pouvons obtenir le traceback directement à partir de l'objet exception (qui se comporte probablement mieux pour le code threadé). De plus, stderr est mis en mémoire tampon , mais la fonction print obtient un argument flush, donc ce serait 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:
En Python 3, par conséquent, traceback.print_exc()
bien qu'il utilise sys.stderr
par défaut , il tamponnerait la sortie, et vous pourriez éventuellement la perdre. Donc, pour obtenir la sémantique la plus équivalente possible, en Python 3, utilisez print
avec flush=True
.
format_exc
place obtenir une chaîne.