TheZTHEZ / UNDERSTANDING FIRST
编程起步入门22 分钟阅读

读懂错误,学会验证

以变量拼写与边界测试为例,学习区分语法错误、运行时错误和逻辑错误,建立有证据的调试流程。

在浏览器中练习 →进度只保存在本机。

学习目标

能区分三类问题:程序无法解析、运行到某处失败、顺利运行但结果错误;会从异常类型、出错行和变量实际值寻找证据;知道一次输出正常不等于所有输入都正确。

必要的前置知识

已经认识赋值、print 和从上到下的执行。下方错误片段用 text 标记,目的是阅读报错,不会被内容测试当成成功示例执行。

概念解释

语法错误像括号不配对、冒号遗漏,程序无法形成合法结构,通常在运行前就被发现。运行时错误只在实际执行到某一步时出现,例如读取不存在的变量。逻辑错误可能完全没有异常,但结果不符合需求,例如该乘 7 却写成乘 6。

错误信息通常包含异常类型和提示。先读最后一行,再回到相应代码位置。多层调用的 traceback 会经过多个位置,需要找自己的代码;本课先研究最短可复现例子,不要求一次读懂长堆栈。

生活化类比

做一道菜失败:配方写不通,相当于语法错误;做到一半发现没有需要的材料,相当于运行时错误;步骤都完成但味道不符合要求,相当于逻辑错误。三种情况的检查方向不同。不能因为“锅没有报错”就断言菜符合目标。

原理示意图

写下预期 → 运行最小示例 → 观察异常类型或实际输出 → 对照每一步的值 → 提出一个原因 → 只改一处 → 再验证。

下方错误知识练习帮助你选择排查方向;理解引擎可以输入完整异常名,例如 NameError。它提供常见原因清单,不声称已经理解整个项目。

完整代码示例

先看一段正确且可运行的代码,用它建立基准:

minutes = 20
days = 7
total = minutes * days
print("实际总分钟:", total)
expected = 140
print("符合预期:", total == expected)

逐行代码讲解

  1. 第 1–2 行给出已知输入,便于手算。
  2. 第 3 行执行乘法,预期得到 140。
  3. 第 4 行把实际值显示出来,而不是只显示“成功”。
  4. 第 5 行把手算得到的预期保存下来。预期应来自需求或独立计算,不能直接抄程序结果。
  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 官方教程:错误和异常。只引用合法原站导航,不复制完整课程。

换个角度理解

像检查一条没送到的快递:先看“地址不存在”还是“门牌格式不对”,再查对应信息。不能只看“失败”两个字就重发所有包裹。

STEP 01读取异常类型与位置
STEP 02对照实际值和预期
STEP 03只改一个原因再验证

错误类型把排查范围缩小。NameError 检查名字,TypeError 检查类型与调用方式,IndexError 检查长度与下标。修复原因比记住错误文字更重要。

CHECK YOUR UNDERSTANDING

自己判断,才知道哪里没懂

先选答案再核对。答错会提供原因和补学方向,不影响课程完成进度。

基础 print(score) 报 NameError,先检查什么?

应用 长度为 3 的列表,最大的非负有效下标?

迁移 工具提示“不支持 import”,可以推断什么?

尚未提交练习。知识掌握度和学习进度分别记录。

把你卡住的代码或错误交给理解引擎 →

这一节,你理解到哪里了?

这是你的自我反馈,与练习估计、课程进度分别记录。

本文为TheZ原创教学内容。正文采用 CC BY-NC-SA 4.0,代码采用 MIT 许可。请尊重署名与授权范围。