e. Equivalente de printStackTrace en python
Sé que print(e)
(donde e es una Excepción) imprime la excepción ocurrida
pero, yo estaba tratando de encontrar el equivalente de python de Java e.printStackTrace()
que exactamente traza la excepción a la línea que se produjo e imprime todo el rastro de la misma.
¿Podría alguien por favor decirme el equivalente de e.printStackTrace()
en Python?
3 answers
import traceback
traceback.print_exc()
Al hacer esto dentro de un bloque except ...:
utilizará automáticamente la excepción actual. Véase http://docs.python.org/library/traceback.html para más información.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-04 13:15:19
También Hay logging.exception
.
import logging
...
try:
g()
except Exception as ex:
logging.exception("Something awful happened!")
# will print this message followed by traceback
Salida:
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 ¿Cómo imprimir el seguimiento completo sin detener el programa?)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:33:25
E. Equivalente de printStackTrace en python
En Java, esto hace lo siguiente (docs):
public void printStackTrace()
Imprime este lanzable y su traza inversa en el flujo de error estándar...
Esto se usa así:
try
{
// code that may raise an error
}
catch (IOException e)
{
// exception handling
e.printStackTrace();
}
En Java, el flujo de error Estándar está sin búfer para que la salida llegue inmediatamente.
Las mismas semánticas 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 seguimiento directamente desde el objeto de excepción (que probablemente se comporta mejor para el código enhebrado). Además, stderr es un búfer de línea , pero la función print obtiene un argumento flush, por lo que esto se imprimiría inmediatamente a 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 utiliza sys.stderr
por defecto , almacenaría la salida en búfer, y posiblemente podría perderla. Así que para obtener una semántica lo más equivalente posible, en Python 3, usar print
con flush=True
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-22 18:00:14