学习目标
能区分三类问题:程序无法解析、运行到某处失败、顺利运行但结果错误;会从异常类型、出错行和变量实际值寻找证据;知道一次输出正常不等于所有输入都正确。
必要的前置知识
已经认识赋值、print 和从上到下的执行。下方错误片段用 text 标记,目的是阅读报错,不会被内容测试当成成功示例执行。
概念解释
语法错误像括号不配对、冒号遗漏,程序无法形成合法结构,通常在运行前就被发现。运行时错误只在实际执行到某一步时出现,例如读取不存在的变量。逻辑错误可能完全没有异常,但结果不符合需求,例如该乘 7 却写成乘 6。
错误信息通常包含异常类型和提示。先读最后一行,再回到相应代码位置。多层调用的 traceback 会经过多个位置,需要找自己的代码;本课先研究最短可复现例子,不要求一次读懂长堆栈。
生活化类比
做一道菜失败:配方写不通,相当于语法错误;做到一半发现没有需要的材料,相当于运行时错误;步骤都完成但味道不符合要求,相当于逻辑错误。三种情况的检查方向不同。不能因为“锅没有报错”就断言菜符合目标。
原理示意图
写下预期 → 运行最小示例 → 观察异常类型或实际输出 → 对照每一步的值 → 提出一个原因 → 只改一处 → 再验证。
下方错误知识练习帮助你选择排查方向;理解引擎可以输入完整异常名,例如 NameError。它提供常见原因清单,不声称已经理解整个项目。
完整代码示例
先看一段正确且可运行的代码,用它建立基准:
minutes = 20
days = 7
total = minutes * days
print("实际总分钟:", total)
expected = 140
print("符合预期:", total == expected)
逐行代码讲解
- 第 1–2 行给出已知输入,便于手算。
- 第 3 行执行乘法,预期得到 140。
- 第 4 行把实际值显示出来,而不是只显示“成功”。
- 第 5 行把手算得到的预期保存下来。预期应来自需求或独立计算,不能直接抄程序结果。
- 第 6 行用
==比较实际与预期,输出 True 或 False。==不会重新赋值。
实际运行结果
实际总分钟: 140
符合预期: True
常见错误分析
看下面这段故意写错的代码:
minutes = 20
print(minute)
# NameError: name 'minute' is not defined
定义的是 minutes,读取的是 minute。它们是两个名字。应修复拼写,而不是重新安装 Python。若把 print 行放到赋值之前,也可能得到同类错误,但原因是顺序不同。异常类型缩小了范围,不会替你保证唯一原因。
再看 print("20" + 7):字符串与整数不能直接相加,会产生 TypeError。先决定需求是数值相加还是文字拼接,再进行合适转换;随意加引号可能让程序能跑却改变含义。
如果把示例的天数误写成 6,程序会正常输出 120,并显示 False。这是有价值的失败证据,不应该把 expected 也改成 120 来“通过”。
交互式演示
在理解引擎选择“报错信息”,粘贴 NameError: name 'minute' is not defined,先说出你会检查的两个位置,再阅读解释。选择代码示例可以看到错误前已产生的状态;错误之后没有执行的步骤不会被补画。下方的分层练习记录答题证据,与手动标记课程完成相互独立。
分层练习
基础: print(score) 提示 NameError。你应先检查名字是否存在,还是改浏览器主题?
应用: 需求是“达到 60 就通过”。某程序用 score > 60,输入 70 正常。再补哪几个测试输入能发现问题?
迁移: 理解引擎提示“不支持 import”,它是在说 Python 不支持导入,还是教学模型尚未实现导入?为什么应区分?
答案与详细解析
基础题先检查名字、拼写、作用域与赋值顺序。主题不会影响变量查找。
应用题至少测试 59、60、61。60 会暴露“达到”包含等于而 > 排除等于的问题:
for score in [59, 60, 61]:
print(score, score >= 60)
输出分别是 59 False、60 True、61 True。这些测试覆盖了边界附近,但还不能证明复杂程序在所有输入下正确。迁移题是模型范围限制;把限制误当语言规则,会建立错误知识。复杂程序请在适当环境测试,不要要求工具猜测无法支持的行为。
延伸学习资源
下一步进入Python 是什么,或打开 TheZ 理解引擎。错误类型可查阅 Python 官方教程:错误和异常。只引用合法原站导航,不复制完整课程。
换个角度理解
像检查一条没送到的快递:先看“地址不存在”还是“门牌格式不对”,再查对应信息。不能只看“失败”两个字就重发所有包裹。
错误类型把排查范围缩小。NameError 检查名字,TypeError 检查类型与调用方式,IndexError 检查长度与下标。修复原因比记住错误文字更重要。
自己判断,才知道哪里没懂
先选答案再核对。答错会提供原因和补学方向,不影响课程完成进度。
尚未提交练习。知识掌握度和学习进度分别记录。
这一节,你理解到哪里了?
这是你的自我反馈,与练习估计、课程进度分别记录。