应传 exc_info=true 的情况是在 except 块中记录当前捕获异常的完整堆栈信息;logger.exception() 是其快捷写法,已默认启用;误用如 except 外调用或仅 log str(e) 会导致堆栈丢失。

使用 _exc_info 参数(实际应为 exc_info)可让 Python 日志自动记录当前异常的完整堆栈信息,便于定位问题。 它不是私有方法或内部参数,而是 logging 模块中 logger 方法(如 error()、exception())的标准关键字参数,类型为布尔值或三元组。正确使用能显著提升排错效率。
什么时候该传 exc_info=True
当代码处于 except 块中,且你想把刚刚捕获的异常详情(包括文件名、行号、函数名和 traceback)写入日志时,就该启用它:
- 不传或设为
False:只记录日志消息,不包含堆栈 - 设为
True:自动调用sys.exc_info()获取最近一次异常信息并格式化输出 - 传入三元组
(type, value, traceback):用于手动传递特定异常上下文(如在 except 外重抛前记录)
exception() 方法已默认开启 exc_info
logger.exception(msg) 是 logger.error(msg, exc_info=True) 的快捷写法,专为异常场景设计:
- 必须在
except块内调用才有效,否则无异常上下文可取 - 即使没显式写
exc_info=True,它也会强制打印堆栈 - 推荐在捕获异常后优先用
exception(),语义更清晰
避免常见误用
以下做法容易导致堆栈丢失或内容错误:
立即学习“Python免费学习笔记(深入)”;
- 在
except外传exc_info=True→ 记录的是上一个(可能无关)异常 - 捕获异常后未处理完就
raise或return,又忘了记日志 → 异常消失,无迹可查 - 用
logging.error(str(e))替代exception()→ 只有错误文本,没有堆栈和上下文 - 自定义异常处理器中忽略
exc_info传递 → 导致日志模块无法还原原始 traceback
简单示例对比
✅ 正确方式(带完整堆栈):
try:
1 / 0
except ZeroDivisionError:
logger.exception("除零错误发生")
❌ 错误方式(只有文字,无堆栈):
try:
1 / 0
except ZeroDivisionError as e:
logger.error(f"出错了:{e}") # 不会打印 traceback









