Để trả lời câu hỏi từ Mr.Zeus đã thảo luận trong phần bình luận của câu trả lời được chấp nhận, tôi sử dụng điều này để ghi lại các trường hợp ngoại lệ chưa được kiểm tra trong bảng điều khiển tương tác (được thử nghiệm với PyCharm 2018-2019). Tôi phát hiện ra sys.excepthooknó không hoạt động trong vỏ trăn nên tôi nhìn sâu hơn và thấy rằng tôi có thể sử dụng sys.exc_infothay thế. Tuy nhiên, sys.exc_infokhông có đối số không giống như sys.excepthookmất 3 đối số.
Ở đây, tôi sử dụng cả hai sys.excepthookvà sys.exc_infođể ghi lại cả hai ngoại lệ trong bảng điều khiển tương tác và tập lệnh có chức năng bao bọc. Để gắn một hàm hook cho cả hai hàm, tôi có hai giao diện khác nhau tùy thuộc vào việc các đối số có được đưa ra hay không.
Đây là mã:
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)
Thiết lập ghi nhật ký có thể được tìm thấy trong câu trả lời của gnu_lorien.