
主题配图 · 来源与许可
适用对象: 刚学 Python、一看到红色报错就想关窗口的零基础学生。
学习目标: 能按顺序读 Traceback;认识 NameError 和 TypeError;知道为什么不能靠乱装包“修”报错。
报错不是电脑在骂人,它在告诉你三件事:哪一行、什么类型的问题、它当时看到了什么。运行时未处理的异常通常带有 Traceback(调用回溯);语法错误不一定显示完整回溯。初学时先看最后一行,再找对应行号。
最后一行通常是 错误类型: 说明。在它上方,Python 会先给出出错的那行源代码和 ^^^ 箭头,箭头标出检测到问题的位置,真正原因有时在前一行或更早处;再往上还有 File "文件名", line 行号,告诉你出事的文件和行号。更上面是程序一路调用过来的过程。零基础阶段,先抓住“最后一行 + 行号 + 箭头”就够了。
读不懂时,先把完整报错从 Traceback 到最后一行复制下来,不要只截最后一句;完整信息里才有行号和调用过程。也不要把报错直接丢给 AI 让它改代码,先自己说出“哪一行、什么类型、我原本想做什么”,再求助。
第一个例子,直接运行:
score = 90
print(scroe)
会看到类似这样的报错:
Traceback (most recent call last):
File "demo.py", line 2, in <module>
print(scroe)
^^^^^
NameError: name 'scroe' is not defined. Did you mean: 'score'?
NameError 的意思是“这个名字没有定义”。第 1 行定义的是 score,第 2 行却写成了 scroe,Python 找不到它。新版 Python 可能贴心地提示“Did you mean: 'score'?”,但不要依赖提示,自己逐字核对更可靠。把第 2 行改成 print(score) 就好了。
第二个例子,运行后输入一个数字:
age = input("你几岁?")
print("明年你" + age + 1 + "岁")
输入 12,最后一行是:
TypeError: can only concatenate str (not "int") to str
TypeError 是类型用错了。input() 拿回来的永远是字符串,所以 age 是 "12",不是数字 12;字符串可以和字符串拼接,但不能直接和整数 1 相加。修复方式有两种:
age = int(input("你几岁?"))
print("明年你", age + 1, "岁")
也可以在上面已经把 age 转为整数后写:print("明年你" + str(age + 1) + "岁")。不要在仍为字符串的 age 上直接计算 age + 1。如果输入的不是数字,int() 会再报 ValueError,那是下一层要处理的问题。
最后说安装包。报错里出现 ModuleNotFoundError,先检查包名拼写、是不是标准库、当前用的是哪个 Python,再考虑安装。确有必要时,用 python -m pip install 包名,确保装进当前解释器;重要项目用虚拟环境(venv)。不要看到教程里一行 pip install 就复制运行,更不要用管理员权限乱装。pip 是包安装工具,不是“修复一切报错”的按钮。
小练习
运行第一个例子,故意把
score改成scoer,观察行号和箭头指向哪里。运行第二个例子并输入
12,再改成int版本;输入“十二”,看看会发生什么。用三行笔记记录一个自己遇到的报错:哪一行、什么类型、我原本以为是什么。
参考与延伸阅读
Python 教程:错误和异常:https://docs.python.org/zh-cn/3/tutorial/errors.html
Python 教程:虚拟环境和包:https://docs.python.org/zh-cn/3/tutorial/venv.html
在 Windows 上使用 Python:https://docs.python.org/zh-cn/3/using/windows.html
本站编辑整理,DeepSeek 协助初稿,已核对并校订。教程中的有意报错示例用于观察错误;修正版才应正常完成。