Để 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.excepthook
nó 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_info
thay thế. Tuy nhiên, sys.exc_info
không có đối số không giống như sys.excepthook
mất 3 đối số.
Ở đây, tôi sử dụng cả hai sys.excepthook
và 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.