
Python 中自定义异常类的核心是继承内置的 Exception(或其子类),并通过 __init__ 方法控制错误信息的构造逻辑,必要时可添加额外属性便于错误诊断。
继承合适的基类
绝大多数情况下应直接继承 Exception;若需语义更明确,可继承其子类,例如:
- ValueError:用于参数值不合法(如传入负数给只接受正数的函数)
- TypeError:用于类型不匹配(如期望列表却收到字符串)
- RuntimeError:用于运行时无法归类的意外状态
不建议无理由继承 BaseException(如 SystemExit、KeyboardInterrupt 的父类),否则可能干扰程序正常退出机制。
重写 __init__ 实现灵活报错
自定义异常类通常重写 __init__,以支持多种初始化方式并封装上下文信息:
立即学习“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),便于统一处理和文档生成。


















