一、程序为什么会出错?(3 大类原因)
程序运行报错,只有这 3 种情况:
-
代码写错了(Bug)
比如:整数当成列表用、语法写错、缩进错误。
✅ 必须改代码修复。
-
用户输入乱搞
比如:让输数字,用户输字母;让输邮箱,用户输空。
✅ 加判断就能解决。
-
外部环境出问题(异常)
比如:写文件时磁盘满了、断网、文件被删了。
✅ 无法预测,必须用异常处理
二、Python 错误处理:try-except 最核心用法
1. 编程思路
遇到可能出错 try 出错了怎么办 → 写在
不管错不错都要执行 → 写在 finally
2. 万能模板(小白直接背)
try:
# 可能会报错的代码
except 错误类型:
# 出错后执行的代码
else:
# 没出错才执行
finally:
# 无论如何都执行(关闭文件、断开网络等)
3. 实例 1:最常见的 除零错误
# 代码
try:
result = 10 / 0 # 这里一定会报错
except ZeroDivisionError:
print("错误:不能除以0!")
else:
print("计算结果:", result)
finally:
print("程序执行完毕")
运行结果:
错误:不能除以0!
程序执行完毕
解析:
10/0触发ZeroDivisionError- 直接跳到
except执行 finally无论对错都会运行
4. 实例 2:用户输入错误(ValueError)
try:
age = int(input("请输入年龄:")) # 输字母会报错
except ValueError:
print("错误:必须输入数字!")
解析:
int() 只能转数字,输字母会触发。
5. 实例 3:捕获所有错误(新手常用)
try:
a = 1
a.append(2) # 整数没有append方法,会报错
except Exception as e: # 捕获所有错误
print("出错啦:", e)
运行结果:
出错啦: 'int' object has no attribute 'append'
Python 异常分层:
BaseException(所有异常祖宗)
系统退出类异常(SystemExit、KeyboardInterrupt等,不归 Exception 管)
except Exception = 拦截Exception 子类的全部报错 ,不止AttributeError
三、Python 调试:怎么找到错在哪?
1. 最简单调试法:print () 打印变量
小白最实用,直接看变量值对不对。
a = 5
b = 3
print("a =", a) # 调试用
print("b =", b)
print(a + b)
2. 专业调试:pdb 单步执行
命令行运行:
python -m pdb 你的文件.py
常用命令:
n下一步p 变量名查看变量q退出
四、Python 测试:保证代码不出错
1. 为什么要测试?
改代码后,一键验证功能没坏。
2. 单元测试(简单例子)
测试一个加法函数对不对:
# 要测试的函数
def add(x, y):
return x + y
# 测试代码
def test_add():
assert add(1, 2) == 3 # 正确就继续,错误就崩溃
assert add(-1, 1) == 0 ##assert断言
print("所有测试通过!")
test_add()
解析:
assert 条件:条件不成立直接报错。 这就是最基础的。
五、常见 Python 错误中文对照表(必看)
表格
| 错误英文 | 中文意思 | 常见原因 |
|---|---|---|
| SyntaxError | 语法错误 | 少冒号、括号不匹配 |
| IndentationError | 缩进错误 | 空格和 Tab 混用 |
| NameError | 名称错误 | 使用了没定义的变量 |
| TypeError | 类型错误 | 整数当列表用、字符串加数字 |
| ValueError | 值错误 | 转 int 时输了字母 |
| IndexError | 索引错误 | 列表下标越界 |
| KeyError | 键错误 | 字典查了不存在的 key |
| ZeroDivisionError | 除零错误 | 除数是 0 |
| FileNotFoundError | 文件不存在 | 打开了不存在的文件 |
练习题(带答案)
练习题 1
下面代码会报什么错?为什么?
print(10 + "5")
答案:
TypeError 类型错误 原因:整数和字符串不能直接相加。
练习题 2
补全代码,让程序不崩溃,并提示 "输入错误":
try:
num = int(input("输入数字:"))
except ???:
print("输入错误")
答案:
except ValueError:
练习题 3
写出try-except-else-finally完整结构,计算20/0并捕获错误。
答案:
try:
20 / 0
except ZeroDivisionError:
print("不能除以0")
else:
print("计算成功")
finally:
print("运行结束")
练习题 4
写一个函数,接收两个数做除法,出错返回 None。
答案:
def divide(x, y):
try:
return x / y
except:
return None
print(divide(6, 2)) # 3
print(divide(5, 0)) # None
try /except 核心逻辑(你总结的完全对)
先跑 try 里面的代码
如果 try 里没报错 → 跳过 except,直接往下走
如果 try 里报错了 → 立刻停止 try,跑去执行 except
总结(小白必背 3 句话)
- 代码可能出错 → 用
try-except包起来 - 找错最简单 → 用
print()打印变量 - 保证代码正确 → 用
assert做测试