目录
一、异常处理核心机制
Python 异常处理基于异常类继承体系,所有异常均继承自 BaseException
基类。理解异常层次结构是掌握异常处理的关键:
BaseException
├── KeyboardInterrupt(用户中断执行)
├── SystemExit(解释器退出)
├── GeneratorExit(生成器关闭)
└── Exception(常规异常基类)
├── ArithmeticError(算术错误)
│ ├── ZeroDivisionError(除零错误)
│ └── OverflowError(数值溢出)
├── LookupError(查找错误)
│ ├── IndexError(索引越界)
│ └── KeyError(字典键缺失)
└── OSError(系统操作错误)
├── FileNotFoundError(文件未找到)
└── PermissionError(权限不足)
二、十大核心异常类详解
1. ValueError
触发场景:参数类型正确但值不合法
典型用例:int("abc")
转换失败,日期格式解析错误
处理建议:配合条件判断进行输入验证
2. TypeError
触发场景:操作或函数应用于错误类型对象
典型用例:字符串与数值相加,len(42)
调用
处理技巧:使用 isinstance()
进行类型检查
3. FileNotFoundError
触发场景:访问不存在的文件路径
典型用例:open("non_exist.txt")
文件操作
最佳实践:配合 os.path.exists()
预检查
4. KeyError
触发场景:字典查找不存在的键
处理方案:改用 dict.get()
方法或预检查键存在性
扩展应用:配置数据缺失处理
5. IndexError
触发场景:序列索引超出范围
典型用例:list[10]
访问空列表元素
防御策略:循环时使用 enumerate()
或范围检查
6. ZeroDivisionError
触发场景:数学运算中除数为零
处理模式:计算前验证分母合法性
7. AttributeError
触发场景:访问不存在的对象属性
典型用例:datetime.datetime.month()
错误方法调用
调试技巧:使用 dir(obj)
查看有效属性
8. ImportError
触发场景:模块导入失败
常见原因:路径配置错误、依赖缺失
解决方案:检查 sys.path
或使用虚拟环境
9. OSError
父类异常:涵盖系统相关错误(Python3合并IOError)
子类细分:
PermissionError
:文件操作权限不足TimeoutError
:系统级操作超时
10. KeyboardInterrupt
特殊性质:用户主动中断程序(Ctrl+C)
处理建议:通常不捕获,用于开发调试阶段
三、异常处理进阶技巧
1. 多异常联合捕获
try:
risk_operation()
except (ValueError, TypeError) as e:
print(f"参数错误: {e}")
except OSError as e:
print(f"系统错误: {e.errno}")
2. 异常链传递
try:
parse_config()
except FileNotFoundError as e:
raise RuntimeError("配置文件缺失") from e # 保留原始异常栈
3. 上下文管理器
from contextlib import suppress
with suppress(FileNotFoundError):
os.remove("temp.file") # 自动忽略指定异常
4. 日志记录
import logging
try:
db_operation()
except Exception as e:
logging.exception("数据库操作异常") # 记录完整堆栈
raise
四、自定义异常开发规范
1. 创建业务异常
class PaymentFailed(Exception):
"""支付业务异常基类"""
def __init__(self, code, msg):
self.error_code = code
super().__init__(f"[{code}] {msg}")
2. 异常使用范例
def process_payment(amount):
if amount < 0:
raise PaymentFailed(1001, "金额不能为负")
try:
process_payment(-100)
except PaymentFailed as e:
print(f"支付失败: {e}, 代码: {e.error_code}")
五、异常处理黄金法则
- 精准捕获:优先捕获具体异常,避免裸 except:
- 资源释放:使用 with 语句或 finally 块确保资源清理
- 异常转化:将底层异常封装为业务语义异常
- 日志记录:关键位置记录异常上下文信息
- 性能优化:高频代码避免异常捕获(每秒百万次操作影响性能)