如何在使用Python上下文管理器时打印完整异常堆栈跟踪
Python上下文管理器中如何获取并打印完整异常堆栈跟踪?
在使用Python上下文管理器时,似乎没有直接的方法来打印异常发生时的完整堆栈跟踪。
示例如下:
class SomeContext(): def __enter__(self): pass def __exit__(self, exc_type, exc_value, exc_traceback): print(exc_type) print(exc_value) print(exc_traceback) with SomeContext(): raise Exception('Oh no')
虽然exc_type和exc_value能如预期返回,但exc_traceback仅返回模糊的值(例如:<traceback object at 0x7ff05251d840>)。
尝试打印exc_traceback.__dict__时,会报错:AttributeError: 'traceback' object has no attribute '__dict__'
我知道可以在上下文内的代码外包裹try ... except ...来打印堆栈跟踪,但这很耗时,且不想每次使用该上下文管理器都这么做。此外,Python为何在__exit__中返回异常类型和值,却省略真实的堆栈跟踪?
本问题并非其他类似问题的重复,我的问题聚焦于如何在创建的上下文中“传递堆栈跟踪”。
更新(2023.09.12)
我的临时解决方案如下:
def __exit__(self, exc_type, exc_value, exc_traceback): if exc_type is not None: raise exc_type(exc_value).with_traceback(exc_traceback)
有时仍无法获取完整堆栈跟踪(例如处理Pydantic ValidationError时,我不得不将exc_type替换为RuntimeError等原生异常),目前我仍在解决该问题。
内容的提问来源于stack exchange,提问作者Nikolas
相关产品推荐
相关产品推荐

