生产环境异常必须触发告警动作而非仅打日志;需在except块中显式调用告警函数,区分ERROR/WARNING级别,全局excepthook仅作兜底,多线程、Celery、asyncio需独立配置告警入口,并实施告警收敛去重。
用 logging 捕获并告警异常,不是只打日志
Python 默认的异常堆栈只输出到 stderr,不记录、不通知、不分类,生产环境必须接管。关键不是“记录下来”,而是“触发告警动作”——比如发邮件、调企业微信 webhook、写入告警平台。
常见错误是把 logging.exception() 当成告警终点,其实它只是格式化了 traceback,没做任何外发动作。
- 在
except块里调用logging.error()或logging.exception()后,必须紧接着执行告警逻辑(如调用send_alert()) - 避免在日志 handler 里隐式发告警——比如自定义
Handler发邮件,容易阻塞主线程或重复告警 - 区分告警级别:
ERROR级异常要告警,WARNING级通常只记日志不告警,除非业务明确定义为需关注事件
sys.excepthook 全局兜底,但不能替代局部 try/except
未捕获异常(如主线程顶层抛出、线程内未处理异常)会走到 sys.excepthook。这是最后一道防线,但仅适合记录 + 基础通知,不适合做业务级响应。
典型误用:用它代替函数内的 try/except,结果异常发生时无法拿到上下文变量、无法重试、无法降级。
立即学习“Python免费学习笔记(深入)”;