Python 常用异常类全解析与实战指南


一、异常处理核心机制

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}")

五、异常处理黄金法则

  1. 精准捕获:优先捕获具体异常,避免裸 except:
  2. ​资源释放:使用 with 语句或 finally 块确保资源清理
  3. ​异常转化:将底层异常封装为业务语义异常
  4. 日志记录:关键位置记录异常上下文信息
  5. 性能优化:高频代码避免异常捕获(每秒百万次操作影响性能)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yant224

点滴鼓励,汇成前行星光🌟

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值