exceptiongroup 是 python 3.11 引入的用于包装多个并发异常的容器类型,非 exception 的替代基类;必须显式用 except exceptiongroup: 捕获,通过 eg.exceptions 递归遍历子异常处理。

ExceptionGroup 是什么,和普通异常有什么区别?
ExceptionGroup 不是替代 Exception 的新基类,而是用来**包装多个并发发生的异常**的容器类型。它在 Python 3.11 引入,主要配合 asyncio.gather(..., return_exceptions=True) 或 threading/concurrent.futures 中批量任务失败场景使用。普通 except Exception: 默认捕获不到它——必须显式写 except ExceptionGroup:,否则会直接冒泡中断程序。
怎样正确捕获并展开 ExceptionGroup?
不能用 except Exception: 捕获 ExceptionGroup;必须单独声明。捕获后,常用 exceptions 属性遍历子异常:
try:
# 假设这里触发了多个异常(如 asyncio.gather 抛出 ExceptionGroup)
raise ExceptionGroup("task failed", [ValueError("bad input"), TypeError("wrong type")])
except ExceptionGroup as eg:
for e in eg.exceptions:
if isinstance(e, ValueError):
print("处理 ValueError:", e)
elif isinstance(e, TypeError):
print("处理 TypeError:", e)
-
eg.message是组名(如"task failed"),不是错误描述 -
eg.exceptions是元组,元素是原始异常实例,可继续isinstance判断或raise - 不推荐用
str(eg)解析内容——格式不稳定,且丢失类型信息
嵌套 ExceptionGroup 怎么处理?
多个 ExceptionGroup 可能嵌套(比如子任务又抛出自己的 ExceptionGroup)。这时需递归检查 isinstance(e, ExceptionGroup):
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
def handle_exc(exc):
if isinstance(exc, ExceptionGroup):
for e in exc.exceptions:
handle_exc(e) # 递归
else:
print("单个异常:", type(exc).__name__, str(exc))
<p>try:
raise ExceptionGroup("outer", [
ValueError("first"),
ExceptionGroup("inner", [KeyError("missing")])
])
except ExceptionGroup as eg:
handle_exc(eg)</p>
- 忽略递归会导致内层异常被跳过,看似“静默失败”
- Python 3.11.2+ 支持
except* ValueError:语法(PEP 654),但目前兼容性有限,不建议生产环境依赖 -
except*和except不能混用在同一try块中
常见踩坑点:为什么我的 ExceptionGroup 没被捕获?
最常遇到的是「以为写了 except Exception: 就够了」——其实不够。另外几个典型问题:
- 没启用
return_exceptions=True:比如asyncio.gather(task1(), task2())中任一失败就直接抛第一个异常,根本不会生成ExceptionGroup - 误把
ExceptionGroup当成字符串处理:比如if "ValueError" in str(eg):——不可靠,且无法区分同名不同模块的异常 - 在
except ExceptionGroup:块里没 re-raise 子异常,导致上游逻辑收不到具体错误信号 - 日志框架(如
logging.exception())对ExceptionGroup支持不完整,可能只打印第一层,需手动遍历eg.exceptions记录
真正要用好 ExceptionGroup,核心就两条:显式捕获、递归展开。它不改变单异常处理逻辑,只是把「多个错误同时发生」这件事暴露给了你——而是否合并上报、部分忽略、还是逐个重试,得你自己定策略。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










