如何重写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
相关产品推荐
相关产品推荐

