Python程序运行出错时,解释器会输出一段Traceback日志,它记录了异常发生时的调用栈和具体位置。掌握读取方法能大幅提升排查效率。

Traceback的基本结构
一段典型的Traceback由三部分组成:调用栈帧、出错文件与行号、异常类型与描述。看日志时要从下往上读。
从下往上看重点
- 最底行:异常类型如ValueError,以及具体原因描述
- 倒数第二行附近:出错文件、行号、当前代码语句
- 更上面的栈帧:调用路径,显示哪个函数调了哪个函数
一个常见例子
下面代码在除法时传入了零,会抛出ZeroDivisionError。
def calc(a, b):
return a / b
def run():
# 故意传入0触发异常
result = calc(10, 0)
print(result)
if __name__ == '__main__':
run()
运行后Traceback最后几行类似:
Traceback (most recent call last):
File "demo.py", line 8, in <module>
run()
File "demo.py", line 5, in run
result = calc(10, 0)
File "demo.py", line 2, in calc
return a / b
ZeroDivisionError: division by zero
从下往上看,先看到ZeroDivisionError说明除以零,再看到calc函数第二行return a / b,结合run里传了0,问题一目了然。
利用日志定位第三方库问题
如果出错在第三方库内部,Traceback同样会显示库文件路径。你可以顺着栈帧找到自己代码最后一次调用的位置,那里往往才是传入错误参数的根源。
使用logging记录Traceback
在生产环境可用logging模块把异常完整记录下来。
import logging
logging.basicConfig(filename='app.log', level=logging.ERROR)
try:
run()
except Exception as e:
# 记录完整堆栈信息
logging.exception("运行出错")
小结
读Traceback核心是逆向阅读、关注末尾异常与行号。平时多观察常见异常如TypeError、KeyError的日志格式,排查时会更从容。