第九章:异常处理
try/except/else/finally
程序运行时总会遇到意外情况(文件找不到、网络断开、用户输入错误...)。异常处理就像"安全气囊",防止程序因为一个小错误就彻底崩溃。
bash
# 完整的异常处理结构
def safe_divide(a, b):
try:
result = a / b
except ZeroDivisionError:
print("❌ 错误:除数不能为零!")
return None
except TypeError as e:
print(f"❌ 类型错误:{e}")
return None
else:
# 没有异常时执行
print(f"✅ 计算成功:{a} ÷ {b} = {result:.2f}")
return result
finally:
# 无论如何都会执行
print(" (计算过程结束)")
print("=== 测试1:正常 ===")
safe_divide(10, 3)
print("\n=== 测试2:除零 ===")
safe_divide(10, 0)
print("\n=== 测试3:类型错误 ===")
safe_divide(10, "abc")bash
=== 测试1:正常 ===
✅ 计算成功:10 ÷ 3 = 3.33
(计算过程结束)
=== 测试2:除零 ===
❌ 错误:除数不能为零!
(计算过程结束)
=== 测试3:类型错误 ===
❌ 类型错误:unsupported operand type(s) for /: 'int' and 'str'
(计算过程结束)自定义异常
bash
# 自定义异常类
class AgeError(ValueError):
def __init__(self, age, message="年龄必须在 0-150 之间"):
self.age = age
self.message = message
super().__init__(self.message)
def set_age(age):
if not isinstance(age, int):
raise TypeError("年龄必须是整数")
if age < 0 or age > 150:
raise AgeError(age)
return f"年龄设置为:{age}"
# 测试
try:
print(set_age(25))
print(set_age(-5))
except AgeError as e:
print(f"❌ 年龄错误:{e.age} - {e.message}")
except TypeError as e:
print(f"❌ 类型错误:{e}")bash
年龄设置为:25
❌ 年龄错误:-5 - 年龄必须在 0-150 之间⚠️ 注意: ⚠️ 最佳实践:不要用except:(不带异常类型)捕获所有异常!这会隐藏真正的 Bug。始终指定具体的异常类型。