You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重写ExceptionGroup的__str__方法以包含子异常信息?

解决ExceptionGroup捕获后打印不显示子异常详情的问题

问题原因

Python 3.11+引入的ExceptionGroup,直接抛出时解释器会自动展开显示所有子异常的完整信息(包括回溯),但捕获后直接打印时,默认的__str__方法仅输出组消息和子异常数量,不会展示每个子异常的具体内容。

自定义Errors类实现完整信息打印

通过继承ExceptionGroup并重写__str__方法,结合traceback模块可以实现捕获后打印所有子异常的详情(含回溯):

import traceback

class Errors(ExceptionGroup):
    def __str__(self):
        # 先获取父类的基础描述(组消息+子异常数量)
        base_msg = super().__str__()
        details = [base_msg]
        
        # 遍历所有子异常,拼接每个异常的完整信息(含回溯)
        for idx, exc in enumerate(self.exceptions, start=1):
            details.append(f"\n--- 子异常 {idx} ---")
            # 获取异常的格式化信息(类型、描述、回溯栈)
            exc_details = traceback.format_exception(type(exc), exc, exc.__traceback__)
            details.extend(exc_details)
        
        return ''.join(details)

测试示例

try:
    raise Errors("批量操作失败", [
        ValueError("输入值超出范围"),
        TypeError("预期整数,传入了字符串"),
        RuntimeError("数据库连接超时")
    ])
except Errors as eg:
    print(eg)

关键说明

  • self.exceptions是ExceptionGroup的内置属性,存储了所有子异常的列表,直接遍历即可获取每个子异常实例。
  • traceback.format_exception()函数会返回异常的完整格式化字符串列表,包含异常类型、描述以及完整的回溯栈信息,和解释器直接抛出时的输出格式一致。
  • 如果不需要回溯栈,仅需子异常的描述,可以简化为details.append(f"\n子异常 {idx}: {str(exc)}")。

内容的提问来源于stack exchange,提问作者Dorki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 05:07:09