except*是python 3.11专为exceptiongroup设计的语法,它不捕获异常组本身,而是筛选并处理其中匹配类型的子异常,未匹配的子异常自动重打包继续抛出;普通except无法匹配exceptiongroup内的子异常。

什么是 except*?它和普通 except 有什么本质区别
except* 是 Python 3.11 引入的专门用于处理 ExceptionGroup 的语法,不是普通异常的替代品。它只在捕获由 asyncio.gather(..., return_exceptions=False)、threading.ExceptHookArgs 或显式构造的 ExceptionGroup 抛出时生效。普通 except ValueError: 完全无法匹配 ExceptionGroup 中的子异常——会直接跳过,导致未处理异常崩溃。
关键点在于:except* 不是“捕获多个类型”,而是“从异常组中筛选并处理匹配的子异常”,剩余不匹配的子异常会自动重新打包为新 ExceptionGroup 继续向上抛。
怎么写一个能触发 except* 的最小可运行例子
必须先制造一个 ExceptionGroup。最简单方式是用 except* 配合 raise ExceptionGroup(...),或用 asyncio.gather 并发触发多个异常:
import asyncio
<p>async def fail_fast():
raise ValueError("first error")</p><p>async def fail_slow():
await asyncio.sleep(0.1)
raise TypeError("second error")</p><p>async def main():
try:
await asyncio.gather(fail_fast(), fail_slow())
except<em> ValueError as eg:
print(f"Caught ValueError group: {eg.exceptions}")
except</em> TypeError as eg:
print(f"Caught TypeError group: {eg.exceptions}")</p><p>asyncio.run(main())
</p>
注意:asyncio.gather 默认 return_exceptions=False,此时多个异常会聚合成 ExceptionGroup;若设为 True,则返回包含异常对象的列表,不会触发 except*。
except* 捕获后还能访问原始异常组信息吗
可以,但方式和普通 except 不同:eg 绑定的对象是 BaseExceptionGroup 实例(不是单个异常),它有三个关键属性:
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
-
eg.exceptions:元组,包含所有匹配该except*类型的子异常(可能为空) -
eg.message:字符串,如"2 exceptions in ExceptionGroup" -
eg.__cause__和eg.__context__:保留原始异常链信息
常见误操作:试图对 eg 调用 str() 或直接打印,结果只是简略描述;要看到完整堆栈,得遍历 eg.exceptions 并分别 traceback.print_exception(e)。
容易踩的坑:嵌套 except* 和混合使用 except 的行为
except* 和 except 不能混写在同一 try 块中——Python 解析器会报 SyntaxError: cannot mix 'except' and 'except*'。必须二选一。
多个 except* 是按顺序尝试匹配,但匹配不是“排他性”的:比如一个 ExceptionGroup 含 [ValueError, TypeError, ValueError],except* ValueError 会拿到两个 ValueError,剩下的 TypeError 会交给下一个 except*;如果没有匹配项,整个组原样重抛。
真正容易忽略的是:如果所有 except* 都没匹配到任何子异常,Python 不会静默吞掉异常,而是抛出原始 ExceptionGroup —— 这和普通 except “兜底失败就继续抛”逻辑一致,但初学者常误以为“写了 except* 就算处理了”。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










