Sé que print(e)(donde e es una excepción) imprime la excepción ocurrida, pero estaba tratando de encontrar el equivalente de Python de Java e.printStackTrace()que rastrea exactamente la excepción hasta la línea en la que ocurrió e imprime el rastro completo.

¿Alguien podría decirme el equivalente de e.printStackTrace()en Python?

respuesta
import traceback
traceback.print_exc()

Al hacer esto dentro de un except ...:bloque, usará automáticamente la excepción actual. Consulte http://docs.python.org/library/traceback.html para obtener más información.

También logging.exceptionhay

import logging

...

try:
    g()
except Exception as ex:
    logging.exception("Something awful happened!")
    # will print this message followed by traceback

Producción:

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/ a través de Cómo imprimir el rastreo completo sin detener el programa? )

e.printStackTrace equivalent in python

En Java, esto hace lo siguiente ( docs ):

public void printStackTrace()

Prints this throwable and its backtrace to the standard error stream...

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 no se almacena en búfer para que la salida llegue de inmediato.

La misma semántica en Python 2 es:

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.

Pitón 3

En Python 3, podemos obtener el rastreo directamente desde el objeto de excepción (que probablemente se comporte mejor para el código enhebrado). Además, stderr tiene un búfer de línea , pero la función de impresión obtiene un argumento de descarga, por lo que esto se imprimiría 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 se usa sys.stderr de forma predeterminada , almacenaría en búfer la salida y es posible que la pierda. Entonces, para obtener la semántica más equivalente posible, en Python 3, use printwith flush=True.

Además de las otras excelentes respuestas, podemos usar los métodos , , , y de la loggingbiblioteca de Python. Citando los documentos de Python 3.7.4 ,debug()info()warning()error()critical()

There are three keyword arguments in kwargs which are inspected: exc_info which, if it does not evaluate as false, causes exception information to be added to the logging message.

Lo que esto significa es que puede usar la loggingbiblioteca de Python para generar un debug()mensaje u otro tipo de mensaje, y la loggingbiblioteca incluirá el seguimiento de la pila en su salida. Con esto en mente, podemos hacer lo siguiente:

import logging

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

def f():
    a = { 'foo': None }
    # the following line will raise KeyError
    b = a['bar']

def g():
    f()

try:
    g()
except Exception as e:
    logger.error(str(e), exc_info=True)

Y saldrá:

'bar'
Traceback (most recent call last):
  File "<ipython-input-2-8ae09e08766b>", line 18, in <module>
    g()
  File "<ipython-input-2-8ae09e08766b>", line 14, in g
    f()
  File "<ipython-input-2-8ae09e08766b>", line 10, in f
    b = a['bar']
KeyError: 'bar'