¿Cómo imprimo una excepción en Python?

Resuelto TIMEX asked hace 14 años • 11 respuestas

¿Cómo imprimo el error/excepción en el except:bloque?

try:
    ...
except:
    print(exception)
TIMEX avatar Sep 27 '09 18:09 TIMEX
Aceptado

Para Python 2.6 y posteriores y Python 3.x:

except Exception as e: print(e)

Para Python 2.5 y versiones anteriores, utilice:

except Exception,e: print str(e)
jldupont avatar Sep 27 '2009 12:09 jldupont

El tracebackmódulo proporciona métodos para formatear e imprimir excepciones y sus rastreos, por ejemplo, esto imprimiría una excepción como lo hace el controlador predeterminado:

import traceback

try:
    1/0
except Exception:
    traceback.print_exc()

Producción:

Traceback (most recent call last):
  File "C:\scripts\divide_by_zero.py", line 4, in <module>
    1/0
ZeroDivisionError: division by zero
Cat Plus Plus avatar Sep 27 '2009 12:09 Cat Plus Plus

En Python 2.6 o superior es un poco más limpio:

except Exception as e: print(e)

En versiones anteriores todavía es bastante legible:

except Exception, e: print e
ilya n. avatar Sep 27 '2009 16:09 ilya n.

Pitón 3:logging

En lugar de utilizar la función básica , se puede utilizar print()el módulo más flexible para registrar la excepción. loggingEl loggingmódulo ofrece muchas funciones adicionales, por ejemplo, registrar mensajes...

  • en un archivo de registro determinado, o
  • con marcas de tiempo e información adicional sobre dónde ocurrió el registro.

Para obtener más información, consulte la documentación oficial .


Uso

Se puede registrar una excepción con la función a nivel de módulo logging.exception()de esta manera:

import logging

try:
    1/0
except BaseException:
    logging.exception("An exception was thrown!")

Producción

ERROR:root:An exception was thrown!
Traceback (most recent call last):
File ".../Desktop/test.py", line 4, in <module>
    1/0
ZeroDivisionError: division by zero 

Notas

  • la función logging.exception()solo debe llamarse desde un controlador de excepciones

  • el loggingmódulo no debe usarse dentro de un controlador de registro para evitar RecursionError(gracias @PrakharPandey)


Niveles de registro alternativos

También es posible registrar la excepción con otro nivel de registro pero aún así mostrar los detalles de la excepción usando el argumento de palabra clave exc_info=True, así:

logging.critical("An exception was thrown!", exc_info=True)
logging.error   ("An exception was thrown!", exc_info=True)
logging.warning ("An exception was thrown!", exc_info=True)
logging.info    ("An exception was thrown!", exc_info=True)
logging.debug   ("An exception was thrown!", exc_info=True)

# or the general form
logging.log(level, "An exception was thrown!", exc_info=True)

Solo nombre y descripción

Por supuesto, si no desea el rastreo completo sino solo alguna información específica (por ejemplo, nombre y descripción de la excepción), aún puede usar el loggingmódulo de esta manera:

try:
    1/0
except BaseException as exception:
    logging.warning(f"Exception Name: {type(exception).__name__}")
    logging.warning(f"Exception Desc: {exception}")

Producción

WARNING:root:Exception Name: ZeroDivisionError
WARNING:root:Exception Desc: division by zero
winklerrr avatar Oct 30 '2019 09:10 winklerrr

(Iba a dejar esto como comentario sobre la respuesta de @jldupont, pero no tengo suficiente reputación).

También he visto respuestas como la respuesta de @jldupont en otros lugares. FWIW, creo que es importante tener en cuenta que esto:

except Exception as e:
    print(e)

imprimirá la salida de error sys.stdoutde forma predeterminada. Un enfoque más apropiado para el manejo de errores en general sería:

except Exception as e:
    print(e, file=sys.stderr)

(Tenga en cuenta que debe import syshacerlo para que esto funcione). De esta manera, el error se imprime en STDERRlugar de STDOUT, lo que permite el análisis/redireccionamiento/etc. de salida adecuados. Entiendo que la pregunta se refería estrictamente a "imprimir un error", pero parece importante señalar aquí las mejores prácticas en lugar de omitir este detalle que podría conducir a un código no estándar para cualquiera que eventualmente no aprenda mejor.

No he usado el tracebackmódulo como en la respuesta de Cat Plus Plus, y tal vez esa sea la mejor manera, pero pensé en tirar esto.

grish avatar Sep 21 '2018 19:09 grish