报错诊疗手册

Python 的报错是所有语言里最友好的——前提是学生会读。一读病名,二翻病历,三问数据, 十二个字。本页把它拆到每一行、每一种常见病,配三道抢答题,直接投屏用。

用途 · 第一课第 28 分钟起 形式 · 可打印 / 可投屏 配套 · 预埋 bug 练习文件
01 / ANATOMY解剖一份 traceback

红字的每一行都在说话

以 grades.py 的真实案发现场为例。四行 traceback 要从下往上读——正好就是三步口诀的顺序。

traceback · grades.py 从下往上读
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读报错三连练

三道题,检验口诀

课堂用法:投屏逐题全班抢答「病根」,点选项即判分。三题分别对应运行期、语法期、类型病。

stat.py · 第 1 题 找出病根

        
病根只有一个,选一个。
05 / PLAY课堂玩法三则

让读报错变成全班的事

同一个口诀,三种参与密度,按班级气氛轮换。

01全班齐读。新的报错类型第一次出现时,齐读最后一行,再一起翻译成人话。读三遍,这个类型就归全班所有了。
02抢答病名。只投最后一行,抢答「类型 + 人话」。答对者获得「今天病历本」署名权——学生会为上墙抢着读。
03报错接龙。把 A 同学刚遇到的报错投出来,点名 B 当医生:B 只许说行号和修法,不许碰键盘。一节课轮五个人。
04埋雷日。每周五教师在一份代码里埋一个雷(本周学过的报错类型),全班找。找到的雷,当堂炸掉。

一个月之后你会发现:学生遇到红字的第一反应从举手,变成了先读最后一行。这一步,就是从背语法跨到做工程的分水岭。

配套材料 · 第三级预埋 bug 练习集——八颗雷,按周发,答案折叠去拿 →