Para responder la pregunta del Sr.Zeus discutida en la sección de comentarios de la respuesta aceptada, utilizo esto para registrar excepciones no capturadas en una consola interactiva (probada con PyCharm 2018-2019). Descubrí sys.excepthook
que no funciona en un shell de Python, así que busqué más y descubrí que podía usarlo sys.exc_info
. Sin embargo, sys.exc_info
no toma argumentos a diferencia de los sys.excepthook
que toma 3 argumentos.
Aquí, uso ambos sys.excepthook
y sys.exc_info
para registrar ambas excepciones en una consola interactiva y un script con una función de contenedor. Para adjuntar una función de enlace a ambas funciones, tengo dos interfaces diferentes dependiendo de si se dan argumentos o no.
Aquí está el código:
def log_exception(exctype, value, traceback):
logger.error("Uncaught exception occurred!",
exc_info=(exctype, value, traceback))
def attach_hook(hook_func, run_func):
def inner(*args, **kwargs):
if not (args or kwargs):
# This condition is for sys.exc_info
local_args = run_func()
hook_func(*local_args)
else:
# This condition is for sys.excepthook
hook_func(*args, **kwargs)
return run_func(*args, **kwargs)
return inner
sys.exc_info = attach_hook(log_exception, sys.exc_info)
sys.excepthook = attach_hook(log_exception, sys.excepthook)
La configuración de registro se puede encontrar en la respuesta de gnu_lorien.