e.printStackTrace equivalente en python

4 minutos de lectura

avatar de usuario
genial

Yo sé eso 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() eso rastrea exactamente la excepción a qué línea ocurrió e imprime el rastro completo de la misma.

¿Podría alguien decirme el equivalente de e.printStackTrace() en Python?

import traceback
traceback.print_exc()

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

  • Si está trabajando dentro de algún tipo de contenedor como Jython y por lo tanto no puede simplemente imprimir la traza, puede format_exc en lugar de obtener una cadena.

    – Rara vez ‘¿Dónde está Mónica?’ Needy

    14 de octubre de 2016 a las 4:13


avatar de usuario
lofidevops

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

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?)

  • ¿Cuáles son las ventajas/desventajas de esto frente a traceback.print_exc() ?

    – Nathan

    3 de febrero de 2020 a las 16:02

  • La mayor ventaja es que puede controlar qué/dónde quiere ver configurando su registrador. Podría, por ejemplo, usarlo para enviar el registro a un servicio de registro en producción para que sea más fácil solucionar problemas difíciles de reproducir.

    – Gobernanza

    19 de enero de 2021 a las 1:05


avatar de usuario
Rusia debe sacar a Putin

e.printStackTrace equivalente en python

En Java, esto hace lo siguiente (documentos):

public void printStackTrace()

Imprime este arrojable y su seguimiento al 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 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). También, stderr tiene búfer de líneapero la función de impresión obtiene un argumento de descarga, por lo que 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 por defecto, amortiguaría la salida y es posible que la pierda. Entonces, para obtener la semántica más equivalente posible, en Python 3, use print con flush=True.

Agregando a las otras excelentes respuestas, podemos usar Python logging de la biblioteca debug(), info(), warning(), error()y critical() métodos. Citando de los documentos para Pitón 3.7.4,

Hay tres argumentos de palabras clave en kwargs que se inspeccionan: exc_info que, si no se evalúa como falso, hace que se agregue información de excepción al mensaje de registro.

Lo que esto significa es que puedes usar Python logging biblioteca para generar un debug()u otro tipo de mensaje, y el logging biblioteca 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'

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad