e.printStackTrace equivalente en python
En Java, esto hace lo siguiente ( docs ):
public void printStackTrace()
Imprime este elemento arrojable y su retroceso a la secuencia de error estándar ...
Esto se usa así:
try
{
// code that may raise an error
}
catch (IOException e)
{
// exception handling
e.printStackTrace();
}
En Java, la secuencia de error estándar no tiene búfer para que la salida llegue de inmediato.
La misma semántica en Python 2 son:
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, podemos obtener el rastreo directamente del objeto de excepción (que probablemente se comporta mejor para el código enhebrado). Además, stderr tiene un buffer de línea , pero la función de impresión obtiene un argumento de vaciado, por lo que esto se imprimirá inmediatamente en stderr:
print(traceback.format_exception(None, # <- type(e) by docs, but ignored
e, e.__traceback__),
file=sys.stderr, flush=True)
Conclusión:
En Python 3, por lo tanto, traceback.print_exc()
aunque usa sys.stderr
de forma predeterminada , amortiguaría la salida y posiblemente la pierda. Entonces, para obtener la semántica más equivalente posible, en Python 3, use print
con flush=True
.
format_exc
obtener una cadena.