e.printStackTrace-Äquivalent in Python
In Java führt dies Folgendes aus ( Dokumente ):
public void printStackTrace()
Druckt dieses Wurfobjekt und seine Rückverfolgung zum Standardfehlerstrom ...
Dies wird folgendermaßen verwendet:
try
{
// code that may raise an error
}
catch (IOException e)
{
// exception handling
e.printStackTrace();
}
In Java ist der Standardfehlerstrom ungepuffert, sodass die Ausgabe sofort eintrifft.
Die gleiche Semantik in Python 2 ist:
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
In Python 3 können wir den Traceback direkt vom Ausnahmeobjekt abrufen (was sich für Thread-Code wahrscheinlich besser verhält). Außerdem ist stderr zeilengepuffert , aber die Druckfunktion erhält ein Flush-Argument, sodass dieses sofort an stderr gedruckt wird:
print(traceback.format_exception(None, # <- type(e) by docs, but ignored
e, e.__traceback__),
file=sys.stderr, flush=True)
Fazit:
In Python 3 wird daher die Ausgabe gepufferttraceback.print_exc()
, obwohl sie sys.stderr
standardmäßig verwendet wird , und Sie können sie möglicherweise verlieren. Um in Python 3 eine möglichst gleichwertige Semantik zu erhalten, verwenden Sie print
mit flush=True
.
format_exc
stattdessen eine Zeichenfolge abrufen.