Um die Frage von Herrn Zeus zu beantworten, die im Kommentarbereich der akzeptierten Antwort besprochen wurde, verwende ich diese, um nicht erfasste Ausnahmen in einer interaktiven Konsole zu protokollieren (getestet mit PyCharm 2018-2019). Ich fand heraus, sys.excepthook
dass es in einer Python-Shell nicht funktioniert, also schaute ich tiefer und stellte fest, dass ich sys.exc_info
stattdessen verwenden könnte. Jedoch sys.exc_info
nimmt im Gegensatz zu keine Argumentesys.excepthook
zu, dass drei Argumente annimmt.
Hier benutze ich beide sys.excepthook
undsys.exc_info
, um beide Ausnahmen in einer interaktiven Konsole und einem Skript mit einer Wrapper-Funktion zu protokollieren. Um beiden Funktionen eine Hook-Funktion zuzuweisen, habe ich zwei verschiedene Schnittstellen, je nachdem, ob Argumente angegeben werden oder nicht.
Hier ist der Code:
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)
Das Protokollierungssetup finden Sie in der Antwort von gnu_lorien.