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?

Author: Aaron Hall, 2012-03-04

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.

 234
Author: ThiefMaster,
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?)

 96
Author: d3vid,
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.

 14
Author: Aaron Hall,
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