Python3 错误和异常
程序运行时难免出错:除数为 0、文件不存在、下标越界……这些"意外"若不加处理,程序会 直接崩溃。Python 用 try/except 捕获异常并妥善处理,是写出健壮程序的必修课。
错误与异常的区别
- 语法错误:代码不符合语法规则,解释器直接拒绝执行,根本无法运行。
- 异常:语法正确,但运行时出了问题(如除数为 0),可用 try/except 捕获处理。
常见异常类型表
| 异常 | 触发场景 | 例子 |
|---|---|---|
| ZeroDivisionError | 除数为 0 | 1 / 0 |
| ValueError | 值不合法 | int("abc") |
| TypeError | 类型不匹配 | 1 + "a" |
| KeyError | 字典键不存在 | {}["k"] |
| IndexError | 下标越界 | [1][5] |
| FileNotFoundError | 文件不存在 | open("x.txt") |
try / except 基本结构
try:
print(10 / 0) # 触发 ZeroDivisionError
except ZeroDivisionError:
print("除数不能为 0") # 输出:除数不能为 0
print("程序继续运行") # 异常被捕获,程序不中断
一次捕获多个异常
try:
n = int(input("请输入整数:"))
print(100 // n)
except (ValueError, ZeroDivisionError): # 元组列出多种异常
print("输入必须是合法且非零的整数")
else 与 finally:完整结构
try 没异常才执行 else;finally 无论是否异常都执行,顺序 try → except → else → finally,前三者可按需省略:
try:
f = open("no.txt", "r") # 文件不存在
except FileNotFoundError as e: # as e 拿到异常对象
print("打开失败:", e) # 输出:打开失败: [Errno 2] ...
else:
print("读取成功") # 没有异常才执行 else
finally:
print("总是执行") # 无论是否异常都执行
raise 主动抛出与自定义异常
def set_age(age):
if age < 0:
raise ValueError("年龄不能为负数") # 抛出内置异常
print(f"年龄设为 {age}")
class BalanceError(Exception): # 继承 Exception 自定义异常
pass
def withdraw(money):
if money > 100:
raise BalanceError("余额不足")
return money
# set_age(-1) / withdraw(200) 都会抛出对应异常
异常的传递
未被捕获的异常会沿调用栈逐层向上传递,直到被某处捕获或程序终止:
def inner():
return 1 / 0 # 在 inner 中抛出
def outer():
inner() # inner 不处理,异常传到 outer
try:
outer()
except ZeroDivisionError: # 在最外层捕获
print("异常被外层捕获") # 输出:异常被外层捕获
小结:用 try/except 捕获可预期的异常,as e 拿异常对象,else 处理无异常分支,finally 负责收尾;需要时用 raise 主动抛出,还可继承 Exception 自定义异常类型。