绝大多数情况下自定义异常应继承Exception;避免继承BaseException;通过重写__init__和__str__携带结构化上下文;按恢复策略差异拆分异常类;集中定义在exceptions.py并控制__all__导出。
绝大多数情况下,直接继承 Exception 就够了。不要为了“语义清晰”去继承 RuntimeError、ValueError 等内置异常——除非你明确要触发某个已有错误处理逻辑(比如某些框架会专门捕获 ConnectionError 并重试)。
常见误操作是继承 BaseException:这会让异常绕过 except Exception: 捕获,连 sys.excepthook 都可能漏掉,调试时消失得无影无踪。
Exception
except OSError: 捕获的底层系统错误 → 继承 OSError
BaseException(除 SystemExit、KeyboardInterrupt 这类特殊用途)靠重写 __init__ 和 __str__ 是最稳妥的方式。别依赖 args 元组拼接,容易在多语言环境或日志序列化时出错。
class ConfigLoadError(Exception):
def __init__(self, path: str, reason: str, line_no: int = None):
self.path = path
self.reason = reason
self.line_no = line_no
super().__init__(self._build_message())
def _build_message(self) -> str:
msg = f"Failed to load config from {self.path}: {self.reason}"
if self.line_no is not None:
msg += f" (line {self.line_no})"
return msg这样设计的好处:
structlog)直接提取e.path、e.line_no,不用解析字符串raise ConfigLoadError("a.json", "invalid JSON") 中漏传参数导致 AttributeError
当错误恢复策略不同、日志级别不同、或上游调用方需要分别处理时,必须拆分。例如:
RateLimitExceeded(429,应退避重试)和 InvalidAPIKey(401,应报错并通知运维)不能共用一个 APICallError 加 error_type="rate_limit"

TimeoutError 和 ConnectionRefusedError 虽然都属网络问题,但前者可能重试,后者大概率要换节点isinstance(e, TimeoutError) 比 e.error_type == "timeout" 更可靠、IDE 可跳转、类型检查器能识别把所有自定义异常集中放在模块顶层的 exceptions.py 文件里,而不是散落在各处。否则容易出现循环导入,尤其是当你在 models.py 里 raise 异常,又在 exceptions.py 里 import models 做类型提示时。
对外暴露时只用 __all__ 控制,避免用户误导入内部辅助异常:
# exceptions.py
class _InternalValidationError(Exception): # 下划线前缀,不公开
pass
class ValidationError(Exception):
pass
all = ["ValidationError"]
调用方只需 from mypkg.exceptions import ValidationError,不会意外拿到未文档化的内部异常。
真正容易被忽略的是:异常类本身也是对象,如果它引用了大对象(比如存了整个请求体 self.request_data = request),会导致内存泄漏——尤其在长周期服务中。只保留必要字段。
# python
# js
# json
# ai
# 多语言
# 网络问题
相关文章:
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
阿里云网站制作公司,阿里云快速搭建网站好用吗?
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何获取免费开源的自助建站系统源码?
jQuery 常见小例汇总
免费网站制作appp,免费制作app哪个平台好?
非常酷的网站设计制作软件,酷培ai教育官方网站?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
网站制作公司排行榜,四大门户网站排名?
建站主机核心功能解析:服务器选择与网站搭建流程指南
javascript中对象的定义、使用以及对象和原型链操作小结
网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
小型网站建站如何选择虚拟主机?
建站之星代理费用多少?最新价格详情介绍
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
建站之星如何优化SEO以实现高效排名?
实例解析angularjs的filter过滤器
北京网站制作的公司有哪些,北京白云观官方网站?
昆明网站制作哪家好,昆明公租房申请网上登录入口?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
深入理解Android中的xmlns:tools属性
如何快速辨别茅台真假?关键步骤解析
如何用已有域名快速搭建网站?
宿州网站制作公司兴策,安徽省低保查询网站?
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
太平洋网站制作公司,网络用语太平洋是什么意思?
潮流网站制作头像软件下载,适合母子的网名有哪些?
再谈Python中的字符串与字符编码(推荐)
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
名字制作网站免费,所有小说网站的名字?
如何在云指建站中生成FTP站点?
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
内部网站制作流程,如何建立公司内部网站?
较简单的网站制作软件有哪些,手机版网页制作用什么软件?
实惠建站价格推荐:2025年高性价比自助建站套餐解析
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
济南专业网站制作公司,济南信息工程学校怎么样?
网站制作新手教程,新手建设一个网站需要注意些什么?
如何高效配置IIS服务器搭建网站?
已有域名建站全流程解析:网站搭建步骤与建站工具选择
宝塔Windows建站如何避免显示默认IIS页面?
建站ABC备案流程中有哪些关键注意事项?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
,巨量百应是干嘛的?
公众号网站制作网页,微信公众号怎么制作?
定制建站策划方案_专业建站与网站建设方案一站式指南
*请认真填写需求信息,我们会在24小时内与您取得联系。