
Python 中自定义异常类的核心是继承内置的 Exception(或其子类),并通过 __init__ 方法控制错误信息的构造逻辑,必要时可添加额外属性便于错误诊断。
继承合适的基类
绝大多数情况下应直接继承 Exception;若需语义更明确,可继承其子类,例如:
- ValueError:用于参数值不合法(如传入负数给只接受正数的函数)
- TypeError:用于类型不匹配(如期望列表却收到字符串)
- RuntimeError:用于运行时无法归类的意外状态
不建议无理由继承 BaseException(如 SystemExit、KeyboardInterrupt 的父类),否则可能干扰程序正常退出机制。
重写 __init__ 实现灵活报错
自定义异常类通常重写 __init__,以支持多种初始化方式并封装上下文信息:
系统特点: 商品多级分类检索、搜索,支持同一商品多重分类,自由设置显示式样 自由设置会员类型,自由设置权限项目,自由分配每种会员类型和每个会员的权限 灵活的商品定价,最多12级价格自由分配给各种会员类型或会员,也可针对单会员单商品特殊定价 强大的会员管理、帐户管理、订单管理功能和一系列帐务查询统计功能 灵活的会员积分系统,自由设置每个积分事件的积分计算方法 灵活的网站内容发布、管理系统,每个栏目可
立即学习“Python免费学习笔记(深入)”;
- 接收原始错误原因(如原始异常对象),用 __cause__ 关联形成异常链
- 添加业务字段(如 error_code、request_id),方便日志追踪或 API 返回
- 动态生成消息,避免硬编码字符串,提高可维护性
示例:
class InsufficientBalanceError(ValueError):def __init__(self, balance, amount, account_id=None):
self.balance = balance
self.amount = amount
self.account_id = account_id
msg = f"Account {account_id or 'unknown'}: balance {balance} super().__init__(msg)
配合 raise 和 except 精准使用
抛出时直接 raise 实例,捕获时用具体类名(而非泛化的 Exception),保证异常处理意图清晰:
- 避免用 except Exception: 捕获所有异常,掩盖真正问题
- 按业务分层定义异常(如 AuthError、NetworkTimeoutError),使 except 块职责单一
- 在 except 中可重新抛出(raise)或链式抛出(raise NewError(...) from e),保留原始调用栈
补充:异常类的命名与组织
命名采用 PascalCase,以 Error 结尾(如 ConfigLoadError),避免用 Exception 后缀;大型项目中可将异常集中定义在 exceptions.py 模块,并按功能分组(如继承同一基类 AppError),便于统一处理和文档生成。









