登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  python教程

Python ExceptionGroup split 怎么按异常类型拆分

来源:17golang原创

时间:2026-09-27 17:54:10 311浏览 收藏

ExceptionGroup.split(condition) 适合把一组并发或批处理异常按类型拆成两部分:第一项是满足条件的 matched,第二项是不满足条件的 rest。它会递归处理嵌套异常组,同时保留原来的层级关系。

最关键的规则:两个返回值都可能是 None。处理完 matched 后,若 rest 不为空,应继续抛出或交给上层,不能因为已处理一类错误就把其他失败静默吞掉。

要点速览
  • split(ValueError) 返回“匹配组、剩余组”二元组。
  • 嵌套 ExceptionGroup 不会被简单拍平。
  • 按类型集中处理时可用 except*,需要保存两个结果时用 split 更直接。

最小写法:一次得到 matched 和 rest

下面构造一个包含普通异常和嵌套组的示例。传入异常类型后,ValueError 会进入匹配组,其余异常进入剩余组。

errors = ExceptionGroup(
    "批量任务失败",
    [
        ValueError("订单号格式错误"),
        TimeoutError("远程接口超时"),
        ExceptionGroup(
            "子任务失败",
            [ValueError("金额格式错误"), OSError("文件不可读")],
        ),
    ],
)

# split 会递归匹配,但保留原有异常组层级。
matched, rest = errors.split(ValueError)

if matched is not None:
    print("可修复的格式错误:", matched)
if rest is not None:
    print("仍需上报的其他错误:", rest)

如果没有任何异常满足条件,matched 为 None;如果全部满足,rest 为 None。不要直接访问返回值的 exceptions 属性而跳过空值判断。

Python ExceptionGroup 通过 split 拆成 matched 与 rest 的静态结构图
图1:结构图展示 split 以类型条件生成 matched 与 rest 两个新异常组,并保留原有嵌套层级。

同时匹配多种可恢复异常

条件可以写成异常类型元组,把业务上处理策略相同的异常放在一起。比如参数错误和键缺失都可以归入输入校验问题,而超时和系统错误继续交给上层。

recoverable, fatal = errors.split((ValueError, KeyError))

if recoverable is not None:
    # 这里只记录可恢复异常,实际项目可转换成逐条失败结果。
    log_recoverable(recoverable)

if fatal is not None:
    # 未识别异常必须继续可见,避免批处理看似成功。
    raise fatal

不要用过宽的 Exception 作为条件后直接丢弃匹配组,那几乎等于吞掉全部常规错误。拆分条件应对应明确恢复动作,例如重新提示输入、跳过单条记录或进入重试队列。

只处理 matched,rest 必须继续可见

split 的价值不仅是分类,还在于明确责任边界。可恢复组由当前层消费,剩余组保持原始异常结构并继续传播。这样日志、追踪和上层策略仍能看到未知失败。

结果典型处理注意点
matched记录、转换、重试必须有明确恢复策略
rest重新抛出或交给上层不可静默丢弃
None跳过对应分支不要访问其属性
ExceptionGroup matched 处理域与 rest 传播域的静态关系图
图2:结构图区分已知异常处理域与未知异常传播域,避免拆分后无意吞掉 rest。

split 和 except* 怎么选

如果异常已经被抛出,而且希望在一个 try 块中按类型执行处理器,except* 更自然;如果异常组已作为对象拿到,需要先分类、保存结果或交给不同组件,split 更清楚。两者都面向异常组,不要把普通 except 的单异常思路直接套过来。

split 会修改原异常组吗?

不会。它返回派生出的匹配组和剩余组,原异常组仍可保留。

能否按自定义规则拆分?

可以使用官方接口接受的条件形式进行筛选;规则应保持无副作用,并只依据异常本身判断,便于结果复查。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>