WMX · 随记
·Python· 3 分钟阅读

异常链:给错误增加业务语义而不丢失原因

把所有解析错误改成一句“配置错误”,会让排查者不知道究竟是哪一步失败。异常包装需要同时保留上层语义和底层原因。

▶ 本文含视频讲解
▶ 教学视频手动播放 · 英语讲解

Learn Python — Full Course for Beginners

Python 入门课程作为语法与编程背景复习;本文使用的较新标准库特性不保证在该课程中逐项覆盖。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。

播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。

Python 系列概览:输入校验、数据处理与行为验证
Python 系列概览:输入校验、数据处理与行为验证 点击图片查看大图 ↗

问题从哪里出现

把所有解析错误改成一句“配置错误”,会让排查者不知道究竟是哪一步失败。异常包装需要同时保留上层语义和底层原因。

理解核心机制

raise NewError(...) from original 显式设置异常原因。上层可以捕获稳定的业务异常类型,日志仍能看到底层链路;仅拼接错误文本会丢失结构。

动手做一个小实验

Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。

Python11 行 · 可横向滚动
def parse_port(text):
    try:
        return int(text)
    except ValueError as error:
        raise ValueError("port must be an integer") from error

try:
    parse_port("wrong")
except ValueError as error:
    assert isinstance(error.__cause__, ValueError)
    print(str(error), type(error.__cause__).__name__)

适用边界与常见误区

能够转成整数不代表端口范围合法。外部响应应避免暴露内部路径或秘密,内部日志则按需要保留完整异常链。

继续练习

补充范围校验,并区分格式错误与范围错误。比较 raise、raise from 和 from None 的日志输出。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档