sys.excepthook
sys.excepthook 是 Python 中的一个全局异常处理钩子函数,用于捕获未被 try-except 块处理的异常。当程序发生未捕获的异常时,Python 会调用该函数,并传入三个参数:异常类型(exc_type)、异常值(exc_value)和回溯对象(traceback)
主要功能
- 全局异常处理:可以统一处理未被
try-except捕获的异常,避免程序直接崩溃。 - 自定义错误日志:记录异常信息到文件或日志系统,便于后续调试。
- 异常信息格式化:通过
traceback模块打印或存储完整的异常堆栈。
import logging
import sys
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
handler = logging.FileHandler("app.log")
formatter = logging.Formatter("%(asctime)s %(name)s %(levelname)s %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
def handle_uncaught_exception(exc_type, exc_value, exc_traceback):
logger.critical(
"Uncaught exception, application will terminate.",
exc_info=(exc_type, exc_value, exc_traceback),
)
sys.excepthook = handle_uncaught_exception
def divide(a, b):
return a / b
def main():
logger.info("Application start")
a = 10
b = 0
divide(a, b)
logger.info("Application end")
if __name__ == "__main__":
main()
注意事项
- 执行顺序:
sys.excepthook会在异常发生后、程序终止前调用。 - 与
finally的区别:finally是局部块执行,而sys.excepthook是全局处理。 - 线程安全:多线程环境中需确保钩子函数的线程安全性。
实际应用场景
- 日志记录:将崩溃信息保存到文件,如 Selenium 自动化测试中的异常捕获。
- 友好提示:替换默认的错误输出,提供更用户友好的报错信息。
- 调试辅助:在开发阶段快速定位未处理的异常。
如果需要恢复默认行为,可通过 sys.__excepthook__ 调用原始钩子。