python自定义异常需继承exception类而非baseexception,命名用pascalcase加error/warning后缀,构造函数可增强上下文表达,所有异常应集中定义在exceptions.py并统一导出。

Python自定义异常的核心是继承内置的 Exception 类(或其子类),并遵循清晰、语义明确、层级合理的设计原则。不是随便起个类名加个 pass 就算完成,关键在于让异常能准确表达“什么出了问题”以及“为什么值得关注”。
继承链要短而准:优先继承 Exception,慎用 BaseException
自定义异常应直接继承 Exception,而非 BaseException(它是所有异常的根,但 SystemExit、KeyboardInterrupt 等系统级中断也继承它)。若误继承 BaseException,会导致 except Exception: 捕获不到你的异常,破坏常规错误处理逻辑。
- ✅ 推荐写法:
class NetworkTimeoutError(Exception): pass - ❌ 避免写法:
class NetworkTimeoutError(BaseException): pass - 若需区分业务类型,可设中间基类,如
class AppError(Exception): pass,再让DatabaseError(AppError)、AuthError(AppError)继承它,保持一层抽象即可
命名体现意图:用 PascalCase + Error/Warning 后缀
Python 官方 PEP 8 明确建议异常类名使用大驼峰(PascalCase),并以 Error 或 Warning 结尾。这能让使用者一眼识别其用途,也与标准库(如 ValueError、ConnectionError)风格统一。
- ✅ 清晰命名:
InvalidConfigError、RateLimitExceededError、DeprecatedFeatureWarning - ❌ 模糊或违规命名:
config_exception(小写下划线)、BadInput(缺后缀)、MyError(无业务语义)
构造逻辑要实用:支持消息、上下文和链式原因
重写 __init__ 可增强表达力。默认继承已支持传入 message,但可进一步支持字段校验、自动补全上下文,或利用 raise ... from 实现异常链。
立即学习“Python免费学习笔记(深入)”;
- 基础用法:直接调用父类
super().__init__(message)即可满足 90% 场景 - 增强示例:
class ValidationError(Exception): def __init__(self, field, value, reason="invalid"): self.field = field self.value = value self.reason = reason msg = f"Validation failed on '{field}': {value} is {reason}" super().__init__(msg) - 链式抛出(保留原始异常上下文):
raise DataProcessingError("Failed to normalize") from original_exc
模块组织要收敛:集中定义,避免散落各处
将项目中所有自定义异常统一放在 exceptions.py(或 errors.py)中,并在包的 __init__.py 中显式导出,方便使用者一键导入:
-
exceptions.py内容示例:class AppError(Exception): pass class DatabaseError(AppError): pass class ValidationError(AppError): pass
-
__init__.py中添加:from .exceptions import AppError, DatabaseError, ValidationError - 使用者只需
from mypackage import ValidationError,无需记住路径










