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.excepthookdass es in einer Python-Shell nicht funktioniert, also schaute ich tiefer und stellte fest, dass ich sys.exc_infostattdessen verwenden könnte. Jedoch sys.exc_infonimmt im Gegensatz zu keine Argumentesys.excepthook zu, dass drei Argumente annimmt.
Hier benutze ich beide sys.excepthookundsys.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.