Python异常处理完全指南

Python异常处理机制详解
1. 标准异常体系
Python提供了丰富的内置异常类型,形成了一个完整的异常层次结构:
基础异常类
- BaseException: 所有异常的基类
- Exception: 常规错误的基类
- StandardError: 内建标准异常的基类
常见异常类型
# 系统相关
SystemExit # 解释器请求退出
KeyboardInterrupt # 用户中断执行(通常是输入^C)
MemoryError # 内存溢出错误
# 语法和名称相关
SyntaxError # Python语法错误
IndentationError # 缩进错误
NameError # 未声明/初始化对象
AttributeError # 对象没有这个属性
# 类型和值相关
TypeError # 对类型无效的操作
ValueError # 传入无效的参数
AssertionError # 断言语句失败
# 运算相关
ArithmeticError # 数值计算错误的基类
ZeroDivisionError # 除(或取模)零错误
OverflowError # 数值运算超出最大限制
# IO相关
IOError # 输入/输出操作失败
OSError # 操作系统错误
FileNotFoundError # 文件未找到错误
# 其他常见异常
ImportError # 导入模块/对象失败
KeyError # 字典中查找一个不存在的关键字
IndexError # 序列中没有此索引
RuntimeError # 一般的运行时错误
2. 异常处理语法
基本try-except结构
try:
# 可能产生异常的代码
result = 1 / 0
except ZeroDivisionError as e:
# 处理特定异常
print(f"除零错误: {e}")
except Exception as e:
# 处理其他异常
print(f"其他错误: {e}")
else:
# 没有异常时执行
print("操作成功")
finally:
# 无论是否有异常都会执行
print("清理工作")
多异常捕获
try:
# 可能产生多种异常的代码
pass
except (TypeError, ValueError) as e:
# 处理多个异常
print(f"类型或值错误: {e}")
3. 实际应用示例
文件操作异常处理
try:
with open("testfile", "w") as fh:
fh.write("这是一个测试文件,用于测试异常!!")
except IOError as e:
print(f"文件操作错误: {e}")
else:
print("文件写入成功")
网络请求异常处理
import requests
try:
response = requests.get("http://example.com")
response.raise_for_status()
except requests.RequestException as e:
print(f"网络请求错误: {e}")
4. 最佳实践建议
-
异常捕获原则
- 只捕获预期的异常
- 避免捕获所有异常(except:)
- 保持异常处理代码简洁
-
异常处理策略
- 在适当的层级处理异常
- 记录异常信息
- 保持程序状态一致性
-
使用上下文管理器
- 优先使用with语句
- 自动处理资源清理
- 确保异常时资源正确释放
5. 调试技巧
- 使用logging记录异常
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
try:
# 可能出错的代码
pass
except Exception as e:
logger.exception("发生错误")
- 自定义异常
class CustomError(Exception):
def __init__(self, message):
self.message = message
super().__init__(self.message)
常见问题解决
- 文件操作错误:使用with语句自动关闭
- 网络请求超时:设置适当的超时时间
- 数据库连接异常:实现重试机制
- 资源清理:使用finally确保释放