Mr.Zeus'un kabul edilen cevabın yorum bölümünde tartışılan soruyu cevaplamak için, etkileşimli bir konsolda yakalanmamış istisnaları kaydetmek için kullanıyorum (PyCharm 2018-2019 ile test edildi). sys.excepthookPython kabuğunda işe yaramadığını öğrendim , bu yüzden daha derine baktım ve sys.exc_infobunun yerine kullanabileceğimi gördüm . Ancak 3 argümandan sys.exc_infofarklı olarak hiçbir argüman almaz sys.excepthook.
İşte, hem kullanmak sys.excepthookve sys.exc_infobir sarıcı işlevi ile interaktif konsolda hem istisnalar ve bir senaryo oturum açmak için. Her iki işleve bir kanca işlevi eklemek için, bağımsız değişkenlerin verilmesine veya verilmemesine bağlı olarak iki farklı arabirimim var.
İşte kod:
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)
Günlüğe kaydetme kurulumu gnu_lorien'in cevabında bulunabilir.