应创建继承exception的自定义异常类以精准表达业务错误:需规范命名(以error结尾)、添加文档字符串、按业务层级构建继承树、重写__str__增强调试信息、主动raise抛出、并在模块顶层集中声明。

当Python内置异常无法准确表达业务逻辑中的错误场景时,需要创建自定义异常类来增强代码可读性与错误处理的精确性。以下是实现自定义异常的规范方式:
一、继承Exception基类定义基础异常
所有自定义异常应直接或间接继承自Exception类,确保能被通用except Exception捕获,同时避免继承BaseException以防止干扰系统级退出行为。
1、使用class语句声明新异常类,类名以Error结尾,例如NetworkTimeoutError。
2、在类体内添加文档字符串,说明该异常的触发条件和业务含义。
立即学习“Python免费学习笔记(深入)”;
3、可选地重写__init__方法,接收自定义参数(如错误码、上下文数据),并调用super().__init__(message)传递给父类。
二、按业务层级构建异常继承树
通过多级继承组织异常类,形成具有语义层次的异常体系,便于上层代码按需捕获特定范围的错误。
1、定义一个模块级基类,如AppError,继承Exception,作为所有业务异常的根。
2、从AppError派生领域异常类,例如AuthError、DatabaseError、PaymentError。
3、在各领域类下进一步细化,如AuthError可派生InvalidTokenError、PermissionDeniedError。
三、重写__str__或__repr__增强调试信息
覆盖字符串表示方法,使异常实例打印时包含结构化上下文,提升日志可读性和问题定位效率。
1、在自定义异常类中定义__str__方法,返回格式为"[{code}] {message}"的字符串。
2、若需完整调试信息,可在__repr__中补充异常实例的属性值,如self.code、self.timestamp。
3、确保__str__返回值为str类型,避免引发TypeError。
四、使用raise主动抛出自定义异常
在检测到业务规则违反或非法状态时,显式触发自定义异常,替代模糊的通用异常或返回错误码。
1、在函数逻辑中判断条件,如if user.is_blocked: raise UserBlockedError("账户已被冻结")。
2、构造异常实例时传入有意义的message及附加参数,例如UserNotFoundError(user_id=1001)。
3、避免在except块中裸raise,若需包装原异常,使用raise NewError(...) from original_exc语法保留原始追溯链。
五、在模块顶层集中声明异常类
将所有自定义异常定义置于模块的最上方区域(导入语句之后、函数定义之前),便于统一维护与IDE识别。
1、不将异常类嵌套在函数内部,防止多次导入时重复定义导致isinstance判断失效。
2、对同一模块内多个相关异常,使用空行分隔,并保持命名风格一致,如全部采用大驼峰+Error后缀。
3、在__all__列表中显式导出异常类名,控制模块对外暴露的异常接口,避免使用者依赖未声明的内部异常。









