看到满屏红色traceback就想关掉窗口?
从今天起换个视角:报错不是失败通知,是python写给你的路标——而且路标上的字,比你想的好懂得多。
本篇目标:拿到排错三板斧——读traceback、断点调试、日志。
学完这篇,工程起步篇收官,你就有资格开工写项目了。
太长不看版(给想快速上手的你)
| 你要掌握的技能 | 一句话结论 |
|---|---|
| 报错怎么读 | 从下往上读:最后一行是死因,往上找位置 |
| 断点调试 | 行号左侧点红点 → f5启动 → 变量面板实时看值 |
| 日志替代print | logging = 可分级的、可开关的print,一键切debug看全量细节 |
| 排错总流程 | 读报错→缩范围(断点/日志)→搜验证(最后一行原文) |
| 15分钟规则 | 自己挣扎15分钟,再带着“报错+操作+期望”去搜 |
一、报错时的三种人(对号入座)
| 类型 | 行为 | 结果 |
|---|---|---|
| 第一种 | 看见红字直接关窗口,三天不打开编辑器 | 永远在恐惧中循环 |
| 第二种 | 把整段报错复制去搜,碰运气点开第一个链接 | 偶尔能蒙对,但下次还不会 |
| 第三种 | 先读最后一行,十秒钟锁定问题类型和位置,再决定要不要搜 | 本篇的目标 |
先说一个反直觉的事实:90%的报错,答案就写在报错信息里——python的报错可能是所有编程语言里最“说人话”的,只是从来没人教你怎么读。
二、traceback阅读法:三步定位法(核心!)
先看一份真实的案发现场。下面这段代码,运行后炸出一片红:
def calc_average(scores):
total = sum(scores)
return total / len(scores)
scores = [90, 80, "85"] # 混进来一个字符串
print(calc_average(scores))
报错信息:
traceback (most recent call last):
file "main.py", line 6, in <module>
print(calc_average(scores))
file "main.py", line 2, in calc_average
total = sum(scores)
typeerror: unsupported operand type(s) for +: 'int' and 'str'
别慌,按三步读:
步骤①:读最后一行(死因)
typeerror: unsupported operand type(s) for +: 'int' and 'str'
typeerror= 错误类型- 后面的人话翻译:“加号两边一个是int一个是str,加不了”
- 看到这里,你就该去检查参与运算的数据类型
步骤②:往上找位置(案发地点)
file "main.py", line 2, in calc_average
total = sum(scores)
注意:traceback是从下往上读的! 最后一行是错误类型,倒数第二个file行是出错位置。
程序从第6行进入函数,在第2行出事。行号直接跳过去看。
步骤③:往上找链条(怎么走到这一步的)
多层调用时,中间每一行file就是一级“案发链条”。新手阶段重点看最后一行 + 最后一个file行,就够破案了。
破案: 检查第2行用到的scores,发现[90, 80, "85"]里混了个字符串"85"——要么改成85,要么int("85")转个型,结案。
高频报错速查表(建议截图保存)
| 报错类型 | 人话翻译 | 常见原因 |
|---|---|---|
syntaxerror | 语法写错了,python看不懂 | 少了冒号、括号没闭合、引号不成对 |
indentationerror | 缩进不对 | 空格和tab混用是重灾区 |
nameerror | 用了不存在的名字 | 拼错了、忘了定义、作用域不对 |
typeerror | 类型不匹配 | 数字+字符串、传错参数类型 |
indexerror | 列表下标越界 | 只有3个元素,你非要取第5个 |
keyerror | 字典里没有这个键 | 键拼错了,或者数据里 根本不存在 |
modulenotfounderror | 模块没装或装错了环境 | 第3篇的排查三连 |
filenotfounderror | 文件找不到 | 路径不对、当前目录不是你以为的目录 |
三、断点调试:给程序装“监控直播”(重点!)
读报错解决“炸了”的问题,断点解决 “没炸但结果不对” 的问题——它让你看程序的慢动作回放。
vscode三步上手
| 步骤 | 操作 | 说明 |
|---|---|---|
| ① 打断点 | 点行号左侧空白,出现红点 | 选你怀疑的那一行 |
| ② 启动调试 | 按f5(或左侧“运行和调试”面板) | 程序会停在红点处 |
| ③ 观察变量 | 黄色高亮行 = “下一行将执行” | 左侧变量面板实时显示所有变量值 |
此刻奇迹出现了:不用写一行print,所有变量的名字和值实时摆在那里!
两个键走天下
| 按键 | 功能 | 什么时候用 |
|---|---|---|
f10 | 单步跳过,一行一行往下走 | 看每行执行后变量怎么变 |
f5 | 放行,冲到下一个断点 | 跳过你已经确认没问题的部分 |
调试的本质是一个 “猜→验证”循环:猜第12行的total不对→打断点验证→验证了就修,没验证就往前挪断点。
pycharm用户:点行号旁空白 + 点甲虫按钮(debug),概念完全一致。
四、print排查的正确姿势与它的天花板
在学会断点之前,print就是你的土味调试器,它不丢人,但有讲究:
# ❌ 不合格:不知道是哪行打的
print(x)
# ✅ 合格:带上位置标签和类型
print(f"到达检查点2: x={x}, type={type(x)}")
带上位置标签和类型,否则三个print你都不知道哪行打的。
print的天花板
- 调试完要逐行删(容易漏)
- 几十个print互相淹没
- 没法一键关闭/开启
天花板之上,需要日志。
五、logging三板斧:可开关的print(重点!)
logging是python官方的日志模块,你可以把它理解成“可分级的、可开关的print”:
import logging
logging.basicconfig(
level=logging.info, # 开关:只显示info及以上
format="%(asctime)s [%(levelname)s] %(message)s" # 自带时间戳
)
logging.info("开始处理 3 个文件")
logging.warning("第 2 个文件为空,已跳过")
logging.error("保存失败:目标目录不存在")
运行输出:
2026-09-01 20:00:01,342 [info] 开始处理 3 个文件
2026-09-01 20:00:01,343 [warning] 第 2 个文件为空,已跳过
2026-09-01 20:00:01,344 [error] 保存失败:目标目录不存在
五个级别(按事态严重度)
debug < info < warning < error < critical
两条心法
| # | 心法 | 说明 |
|---|---|---|
| ① | 关键节点打点 | 进入函数、拿到结果、写文件前后——各来一条info |
| ② | 级别是总开关 | 平时info安安静静;出事了改成debug,全量细节瞬间放出来——不用删任何一行代码 |
想存档备查?
logging.basicconfig(
filename="app.log", # 👈 加这一行,日志自动写进文件
level=logging.info
)
项目出错时把日志发给帮你的人,比口述“它就是不对劲”专业一百倍。
六、排错总心法:三步 + 一条纪律
把本篇收拢成一张流程卡
读报错(类型+位置+人话)→ 缩小范围(断点或日志)→ 搜索验证(最后一行原文+场景关键词)
15分钟规则(第1篇守则②的完整版)
卡住先自己挣扎15分钟:
| 0~5分钟 | 5~15分钟 | 15分钟后 |
|---|---|---|
| 读报错、定位行号、理解人话 | 试着改、搜关键词、打断点验证 | 没头绪→带着“报错原文+你做了什么+期望什么”去搜/去问 |
搜索时贴报错最后一行(比如typeerror: unsupported operand type(s) for +: 'int' and 'str'),比描述“我这里报错了”有效一万倍。
七、常见报错:调试工具自己的6个坑(重点!)
logging.info(...)打了,屏幕上什么都没有
原因:logging默认级别是warning,info被过滤了。
解法:basicconfig里设level=logging.info。这是logging新手第一坑,本篇直接免疫。
断点打了,但程序根本不停
原因(三选一):
- 你按的是普通运行不是调试(应该按
f5而不是点▶按钮) - 改完代码没保存,断点打在“旧文件”上
- 解释器选错了环境
解法:保存(ctrl+s成肌肉记忆)→ 确认用debug方式启动 → 右下角检查解释器。
traceback里的行号,和我的代码对不上
原因:99%是没保存就运行——报错的是磁盘上的旧文件。
解法:ctrl+s再跑。养成**“保存→运行”连招**,这条自动消失。
代码里有input(),调试时却没地方输入
原因:input()读的是“调试控制台”不是普通终端。
解法:vscode调试时切到下方 “调试控制台”(debug console) 面板输入。
windows终端里print中文乱码
原因:老式cmd默认gbk编码,脚本输出utf-8。
解法:
- 临时:终端执行
chcp 65001切到utf-8 - 长期:用vscode内置终端,一般天生没这毛病
basicconfig设了没效果 / 只有第一次生效
原因:basicconfig只在第一次调用时生效,且必须在任何logging调用之前执行。
解法:把它放在程序最顶上,且只写一次。
配置类代码放最前,是通用好习惯。
八、工程起步篇 · 收官自查
五篇下来,你的工具箱已经齐了:
| 篇目 | 主题 | 你装进工具箱的能力 |
|---|---|---|
| 02 | 环境搭建 | 多版本共存,path与解释器不迷糊 |
| 03 | 依赖管理 | venv独立房间 + requirements存档读档 |
| 04 | git | 8命令存档系统,改崩能反悔 |
| 05 | 项目结构 | 标准目录 + readme门面 + .gitignore |
| 06 | 排错思维 | 读traceback + 断点 + 日志三板斧 |
出门条(全部打勾才算过关)
- 能不看笔记搭好一个多版本python环境
- 能给新项目建虚拟环境并导出requirements.txt
- 会在github上备份自己的项目
- 项目目录符合标准模板,readme拿得出手
- 面对traceback,能说出错误类型和出事位置
九、课后练习(做了才算会)
制造报错实验:故意写出indexerror、keyerror、nameerror各一次,只允许读最后一行,说出错误类型和人话翻译——不许搜;
断点演练:给任意一段循环代码打断点,用f10走三步,观察变量面板里循环变量的变化;
logging替换print:用logging替换项目里所有print——info级别跑一遍,再切debug级别对比输出量;
(选做)最小复现练习:把最近遇到的一个报错,剥离成一个10行以内的小脚本
以上就是python调试与排错指南之断点调试和日志如何优雅地读报错的详细内容,更多关于python断点调试与排错的资料请关注代码网其它相关文章!
发表评论