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.excepthook
Python kabuğunda işe yaramadığını öğrendim , bu yüzden daha derine baktım ve sys.exc_info
bunun yerine kullanabileceğimi gördüm . Ancak 3 argümandan sys.exc_info
farklı olarak hiçbir argüman almaz sys.excepthook
.
İşte, hem kullanmak sys.excepthook
ve sys.exc_info
bir 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.