¿Cómo imprimo una excepción en Python?
¿Cómo imprimo el error/excepción en el except:
bloque?
try:
...
except:
print(exception)
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)
El traceback
mó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
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
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. logging
El logging
mó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 excepcionesel
logging
módulo no debe usarse dentro de un controlador de registro para evitarRecursionError
(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 logging
mó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
(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.stdout
de 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 sys
hacerlo para que esto funcione). De esta manera, el error se imprime en STDERR
lugar 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 traceback
módulo como en la respuesta de Cat Plus Plus, y tal vez esa sea la mejor manera, pero pensé en tirar esto.