01 / ANATOMY解剖一份 traceback
红字的每一行都在说话
以 grades.py 的真实案发现场为例。四行 traceback 要从下往上读——正好就是三步口诀的顺序。
Traceback (most recent call last): File "grades.py", line 12, in <module> avg = round(total / count, 1) ZeroDivisionError: division by zero
| 行 | 位置 | 它在说什么 | 课堂一句话 |
|---|---|---|---|
| 第 4 行 | 病名行 | 错误类型 + 一句话病情 | 「先翻译成人话,再谈别的」 |
| 第 3 行 | 代码回显 | 出事那一句长什么样 | 「病灶本体,照着它问数据」 |
| 第 2 行 | File 行 | 文件名 + 行号:病历首页 | 「编辑器里点行号直达现场」 |
| 第 1 行 | Traceback 头 | 「以下是病历」的开场白 | 「调用越深越靠下,从下往上读」 |
02 / MANTRA三步口诀 · 课堂展开
十二个字,三分钟走完
每一步都有纪律:什么不许做、什么必须由谁说出。
第 1 步 · 0–1 分钟
一读病名。全班齐读最后一行,要求翻译成人话:「除数是 0」。
纪律:这一步不许碰键盘——先读懂,再动手。
纪律:这一步不许碰键盘——先读懂,再动手。
第 2 步 · 1–2 分钟
二翻病历。顺着 File 行跳到第 12 行。教一个动作:编辑器里点行号或 Ctrl+G 跳转。
学生复述:「哪个文件、第几行、哪一句」。
学生复述:「哪个文件、第几行、哪一句」。
第 3 步 · 2–3 分钟
三问数据。只问一句:「哪个变量没按你想的来?」——count 为什么是 0。
纪律:修法必须由学生说出,教师只补语法名次。
纪律:修法必须由学生说出,教师只补语法名次。
「先翻译,再动手;先问数据,再问语法。」
—— 报错教学的全部纪律就这一句。学生背下十二个字,红字从「事故」变成「线索」。
03 / QUICK REF常见报错速查表
十四种高发病,一表带走
按发生阶段分三组。课堂用法:印出来贴墙,学生报错先自己查表,查不到再来问——把「问老师」的默认动作换成「先查表」。
语法期 · 程序还没跑就炸
| 报错 | 人话 | 高发原因 | 一分钟修法 |
|---|---|---|---|
| SyntaxError | 「这句不合语法」 | 少了冒号、括号没闭合、用了中文标点 | 看报错行的上一行行尾 |
| IndentationError: unexpected indent | 「缩进忽多忽少」 | Tab 与空格混用、复制来的代码缩进不齐 | 统一 4 空格,看同块对齐 |
| IndentationError: expected an indented block | 「冒号后面忘了缩进」 | for / if / def 的下一行顶格写了 | 冒号后回车自动缩进 |
运行期 · 跑到一半才炸
| 报错 | 人话 | 高发原因 | 一分钟修法 |
|---|---|---|---|
| NameError | 「这个名字不存在」 | 拼写错、用在定义之前 | 先查拼写,再查顺序 |
| TypeError | 「这两类东西不能这么运算」 | 字符串和数字直接相加 | str() / int() 显式转换 |
| ValueError | 「类型对,内容不认」 | int("abc")、空串转数字 | 先 print 出来看再转 |
| ZeroDivisionError | 「除数是 0」 | 空名单求平均、分母没判空 | 除之前先判 len() |
| IndexError | 「取到货架外了」 | len 和下标差 1 | 直接 for 遍历,别手写下标 |
| KeyError | 「字典里没这把钥匙」 | 键名拼错、键不存在 | 用 .get() 或先 in 判断 |
| AttributeError | 「这东西没这个功能」 | 类型记错(str 当 list 用) | print(type(x)) 看一眼 |
| FileNotFoundError | 「文件不在这个地方」 | 相对路径的工作目录不对 | 绝对路径,或把文件放脚本旁边 |
| ModuleNotFoundError | 「这个库没装」 | 忘 pip install、装错了环境 | 装到当前解释器那个环境 |
逻辑期 · 不报错,最危险
| 症状 | 人话 | 高发原因 | 一分钟修法 |
|---|---|---|---|
| 死循环 | 「while 条件永远为真」 | 循环里忘了更新变量 | 循环里 print 变量,看它动不动 |
| 结果不对但不报错 | 「算出来了,是错的」 | 边界差一、>= 写成 >、条件写反 | 用小数据手算一遍,对答案 |
逻辑期要专门讲一次:最好的报错,是程序自己报——教 assert 和「先打印再相信」两个习惯。
04 / DRILL读报错三连练
三道题,检验口诀
课堂用法:投屏逐题全班抢答「病根」,点选项即判分。三题分别对应运行期、语法期、类型病。
病根只有一个,选一个。
05 / PLAY课堂玩法三则
让读报错变成全班的事
同一个口诀,三种参与密度,按班级气氛轮换。
01全班齐读。新的报错类型第一次出现时,齐读最后一行,再一起翻译成人话。读三遍,这个类型就归全班所有了。
02抢答病名。只投最后一行,抢答「类型 + 人话」。答对者获得「今天病历本」署名权——学生会为上墙抢着读。
03报错接龙。把 A 同学刚遇到的报错投出来,点名 B 当医生:B 只许说行号和修法,不许碰键盘。一节课轮五个人。
04埋雷日。每周五教师在一份代码里埋一个雷(本周学过的报错类型),全班找。找到的雷,当堂炸掉。
一个月之后你会发现:学生遇到红字的第一反应从举手,变成了先读最后一行。这一步,就是从背语法跨到做工程的分水岭。
配套材料 · 第三级预埋 bug 练习集——八颗雷,按周发,答案折叠去拿 →