sys.excepthook 

sys.excepthook 是 Python 中的一个全局异常处理钩子函数,用于捕获未被 try-except 块处理的异常‌。当程序发生未捕获的异常时,Python 会调用该函数,并传入三个参数:异常类型(exc_type)、异常值(exc_value)和回溯对象(traceback)‌

主要功能‌

  1. ‌全局异常处理‌:可以统一处理未被 try-except 捕获的异常,避免程序直接崩溃‌
  2. ‌自定义错误日志‌:记录异常信息到文件或日志系统,便于后续调试‌
  3. ‌异常信息格式化‌:通过 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 是全局处理‌
  • ‌线程安全‌:多线程环境中需确保钩子函数的线程安全性‌

‌实际应用场景‌

  1. ‌日志记录‌:将崩溃信息保存到文件,如 Selenium 自动化测试中的异常捕获‌
  2. ‌友好提示‌:替换默认的错误输出,提供更用户友好的报错信息‌
  3. ‌调试辅助‌:在开发阶段快速定位未处理的异常‌

如果需要恢复默认行为,可通过 sys.__excepthook__ 调用原始钩子‌