Untuk menjawab pertanyaan dari Mr.Zeus yang dibahas di bagian komentar dari jawaban yang diterima, saya menggunakan ini untuk mencatat pengecualian yang tidak tertangkap di konsol interaktif (diuji dengan PyCharm 2018-2019). Saya menemukan sys.excepthook
tidak bekerja di shell python jadi saya melihat lebih dalam dan menemukan bahwa saya bisa menggunakannya sys.exc_info
. Namun, sys.exc_info
tidak mengambil argumen seperti sys.excepthook
itu membutuhkan 3 argumen.
Di sini, saya menggunakan keduanya sys.excepthook
dan sys.exc_info
untuk mencatat pengecualian di konsol interaktif dan skrip dengan fungsi wrapper. Untuk melampirkan fungsi kait ke kedua fungsi, saya memiliki dua antarmuka yang berbeda tergantung apakah argumen diberikan atau tidak.
Berikut kodenya:
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)
Setup logging dapat ditemukan di jawaban gnu_lorien.