如何在Python 3.11中使用except*语法处理任务组异常

浅丽君_1100

浅丽君_1100

2026-10-17

145人浏览

原创

except* 是专为捕获 exceptiongroup 中多个子异常设计的语法,能“拆包”匹配子异常类型;普通 except 只匹配单个异常实例,无法处理 exceptiongroup。

如何在python 3.11中使用except*语法处理任务组异常

什么是 except*,它和普通 except 有什么本质区别

except* 不是增强版的单异常捕获,而是专为「同时抛出多个异常」的场景设计的语法,核心解决的是 asyncio.gather(..., return_exceptions=False) 或 taskgroup.create_task() 中任务组(TaskGroup)里多个子任务各自失败时的聚合异常处理问题。普通 except 遇到 ExceptionGroup 会直接跳过——它只匹配单个异常实例,而 except* 能从 ExceptionGroup 中“拆包”并匹配其中符合类型的子异常。

关键点:只有当异常对象是 ExceptionGroup(或其子类,如 BaseExceptionGroup)时,except* 才会生效;普通 ValueError 抛出来,except* ValueError 是捕获不到的。

在 asyncio.TaskGroup 中必须用 except* 捕获多任务异常

Python 3.11 引入 asyncio.TaskGroup 作为 asyncio.gather 的替代方案,它的设计原则是“任一子任务失败即中止全部”,且把所有已发生的异常打包成 ExceptionGroup 向上抛出。此时若用传统 except ValueError:,会完全漏掉错误。

Claw Code Suite (Python-Only Edition)
Claw Code Suite (Python-Only Edition)

仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...

下载
  • 正确写法必须用 except* ValueError: 或 except* ConnectionError: 等具体类型
  • 可以叠加多个 except* 分支,各自处理不同异常类型(顺序无关,全部匹配)
  • 未被任何 except* 匹配的子异常,会保留在剩余的 ExceptionGroup 中,最终仍会重新抛出
  • 如果想捕获全部子异常,用 except* BaseException:(但慎用,可能掩盖致命错误)
import asyncio
<p>async def maybe_fail(n):
if n == 2:
raise ValueError("failed at 2")
if n == 3:
raise RuntimeError("failed at 3")
return f"ok {n}"</p><p>async def main():
try:
async with asyncio.TaskGroup() as tg:
tg.create_task(maybe_fail(1))
tg.create_task(maybe_fail(2))
tg.create_task(maybe_fail(3))
except<em> ValueError as eg:
print(f"ValueErrors: {len(eg.exceptions)}")  # → 1
except</em> RuntimeError as eg:
print(f"Runtimes: {len(eg.exceptions)}")     # → 1
</p>

except* 的匹配行为与常见踩坑点

except* 不是“捕获一个就停”,而是对 ExceptionGroup 内每个子异常独立尝试匹配——哪怕同一个 except* 分支也会被触发多次(只要对应类型出现多次)。但它不会递归展开嵌套的 ExceptionGroup,只处理直接子异常。

  • 错误示范:except* Exception: → 实际上几乎没用,因为 ExceptionGroup 本身不是 Exception 的实例,它继承自 BaseException;应改用 except* BaseException:(但更推荐精确类型)
  • 混淆点:不能在非 ExceptionGroup 上用 except*,比如普通函数里 raise ValueError,外面写 except* ValueError 会直接报 SyntaxError(解释器拒绝解析)
  • 调试技巧:打印 eg.exceptions 是元组,可遍历查看每个原始异常的 __traceback__ 和 args
  • 注意 return_exceptions=True 的 gather 不会产生 ExceptionGroup,所以不适用 except*

何时该坚持用传统 except,而不是强行上 except*

except* 只在明确知道上游会抛 ExceptionGroup 时才有意义。大多数同步代码、单任务 await、或手动构造的异常,都不涉及该机制。

  • Web 框架中间件、普通 API 视图函数里,异常仍是单个抛出,继续用 except ValueError:
  • 单元测试中模拟多异常?别自己造 ExceptionGroup,除非你真在测 TaskGroup 行为
  • 误以为“多个 except 可以捕获多个异常”——不行,那是误解;单次 raise 只能抛一个异常对象,不管它是不是 ExceptionGroup
  • 跨 Python 版本兼容性:3.11+ 才支持 except*,旧版本需降级为 except ExceptionGroup as eg: + 手动遍历 eg.exceptions

真正需要 except* 的地方其实很窄:就是你主动用了 asyncio.TaskGroup 或显式调用了 exceptiongroup.ExceptionGroup 的时候。其他情况加了也没用,还让代码变难读。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1751

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4504

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1729

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

26437

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3207

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3227

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1183

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2503

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习