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.excepthookque 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_infono toma argumentos a diferencia de los sys.excepthookque toma 3 argumentos.
Aquí, uso ambos sys.excepthooky sys.exc_infopara 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.