科创科普:程序报错了不要慌——读懂报错信息与三步排错法

科创科普:程序报错了不要慌——读懂报错信息与三步排错法

一、报错不是失败,是线索 初学编程最让人泄气的瞬间,往往是屏幕上突然冒出一大段红字。其实报错(error)是计算机在很认真地跟你对话:它明确告诉你「我在哪一行、遇到了什么看不懂的东西」。学会读这段话,你的排错速度至少快十倍。

二、报错信息由三部分组成 看一个典型的报错: Traceback (most recent call last): File "test.py", line 3, in print(score + 1) NameError: name 'score' is not defined

· 第一行 Traceback 表示「线索从这里开始」,它是给懂程序的人看的流程记录; · 中间部分给出文件名和行号:test.py 的第 3 行; · 最后一行最重要,格式是「错误类型:中文说明的英文版」。这里的 NameError 意思是:你用了一个叫 score 的名字,但你从没定义过它。

因此读报错的最快顺序是:先看最后一行(是什么错),再看行号(错在哪),最后才回头看代码——千万不要从头到尾一行行地读代码,那是效率最低的做法。

三、中小学生最常见的六种错误 1. SyntaxError 语法错误:括号没配平、冒号漏写、混进了中文标点。Python 还会用 ^ 号指出它看不懂的那一格。 2. NameError 名字未定义:变量名拼错、大小写不一致,或者用在了赋值之前。 3. TypeError 类型错误:把文字和数字相加,例如 "10" + 5。 4. IndentationError 缩进错误:Python 靠缩进判断一行代码属于谁,if 或 for 下面忘了缩进四格就会报这个错。 5. IndexError 下标越界:列表里只有 3 个元素,却去取第 5 个。 6. ZeroDivisionError 除零错误:分母是 0,常常发生在把用户输入的值直接当分母的时候。 此外还有 ValueError(转换失败,例如 int("abc"))和 KeyError(字典里没有这个键)。

四、三步排错法 第一步:定位。从 Traceback 里找到最后一个属于「你自己的文件名」的行号,从那一行开始查。 第二步:验证假设。在出错行前面加一句 print(),把可疑变量的值和类型打出来: n = input("请输入数字:") print(type(n), n) # 看看它到底是什么

如果打印出 12,那就说明忘了做 int() 转换,问题瞬间定位。 第三步:最小化。把怀疑的那几行单独复制到新文件里,用最简单的一组数据跑一遍。剥掉无关代码之后,问题往往一眼可见。

五、三个真实的修错案例 案例一:平均分算成了字符串拼接 score1 = input("第一科:") score2 = input("第二科:") print("平均分:", (score1 + score2) / 2)

报 TypeError。原因是两个 input() 返回的都是字符串,"90" + "80" 会拼成 "9080",更不能拿来除 2。修法:改成 float(input(...)) 或 int(input(...)),先转换再计算。

案例二:循环体缩进丢了 for i in range(3): print(i)

报 IndentationError。Python 是从缩进判断这行是否属于循环体的,补上四个空格就能跑通。缩进不是排版,是语法。

案例三:不报错但结果不对 这类错误最难抓,因为计算机认为一切正常。例如算平均分时把科目数写成了 2,或者除法的顺序反了。办法是「用打印做探照灯」:把每一步的中间结果都打印出来,看哪一步开始偏离预期。逻辑错误只能靠对比「预期值」和「实际值」来发现,所以写代码前最好先想清楚:这一步应该得到什么数?

六、Scratch 里的「报错」 图形化编程没有红字提示,但排错套路是相通的:角色不动,先看绿旗有没有点、脚本是否挂在「当绿旗被点击」下面;点击没反应,检查积木是不是悬空在脚本末尾之外(悬空的积木永远不会执行);角色跑出舞台,检查坐标和「移动 10 步」的次数;没有声音,检查音量与「播放声音」是否需要等待播完。把「猜想—验证—再猜想」变成习惯,比盲目改参数有效得多。

七、练习 1. 判断下面报错属于哪一类:print("你好"(少了右括号) 2. 下面代码错在哪里:a = 5,然后 print(A + 1) 3. nums = [10, 20, 30],执行 nums[3] 会报什么错?为什么? 4. 用户输入 "abc" 时,int(input()) 会报什么错?怎样写程序才不会被它卡住? 5. 写一段代码,让用户输入两个数并输出商;要求当第二个数是 0 时提示「除数不能为 0」,而不是报错。

参考答案思路: 1. SyntaxError(语法错误,括号不配对)。 2. NameError:a 和 A 是两个不同的名字,大小写敏感。 3. IndexError:下标从 0 开始,有效下标是 0、1、2,没有第 3 号。 4. ValueError;可以先判断输入内容是不是数字,或者用 try/except 捕获异常后提示重新输入。 5. 用条件判断:if b != 0: print(a / b) 否则 print("除数不能为 0")。