如何将 traceback 对象(sys.exc_info()[2],与 sys.exc_traceback 相同)转换为字符串?

10

我有一个函数可以捕获所有异常,我希望能够在此函数内将追溯信息转换为字符串。

目前这样做并没有成功:

def handle_errors(error_type, error_message, error_traceback):
    """catch errors"""
    import traceback
    error = {}
    error['type'] = error_type.__name__
    error['message'] = str(error_message)
    error['file'] = os.path.split(error_traceback.tb_frame.f_code.co_filename)[1]
    error['line'] = error_traceback.tb_lineno
    error['traceback'] = repr(traceback.print_tb(error_traceback))
    ### finalise error handling and exit ###

sys.excepthook = handle_errors

错误在 error['traceback'] 这一行。我甚至需要使用 traceback 模块吗?

根据这个有点类似的问题我已经尝试过:

error['traceback'] = repr(error_traceback.print_exc())

...但是这会导致一个错误:

Error in sys.excepthook:
Traceback (most recent call last):
  File "xxxxxxxxxxx", line 54, in handle_errors
    error['traceback'] = repr(error_traceback.print_exc())
AttributeError: 'traceback' object has no attribute 'print_exc'

可能是获取完整的回溯的重复问题。 - Paolo Casciello
@eyquem,因为那个问题不是关于在excepthook函数中捕获traceback的。excepthook函数提供了一个traceback帧来查询(error_traceback),但那个问题并没有解决如何使用这个帧的问题。 - mulllhausen
我不明白你说的是哪个“其他问题”?是哪一个问题? - eyquem
此外,我注意到了一些之前没有注意到的东西:在“handle_errors”的定义中,引用_error['traceback']_被分配给traceback.print_tb(error_traceback)的repr(),而异常的描述说它是error_traceback.print_exc()的repr()。 - eyquem
要查看我所说的另一个问题,请单击我先前评论中的“那个其他问题”链接词。这是您在我的原始帖子顶部放置“此问题可能已经在此处有答案:”的那个问题。 - mulllhausen
显示剩余2条评论
2个回答

19

使用traceback.format_tb()代替print_tb()以获取格式化的堆栈跟踪(作为行列表):

error['traceback'] = ''.join(traceback.format_tb(error_traceback))

print_tb() 直接输出 traceback,这就是为什么你会得到 None 作为结果(对于任何不明确返回内容的 Python 函数来说,这都是默认值)。


2
你的回答让我找到了精确的解决方案。 - eyquem

0

traceback.format_exc([limit])
这个函数类似于 print_exc(limit),但是返回一个字符串而不是打印到文件中。

自版本2.4起新增。

error['traceback'] = traceback.format_exc(error_traceback)

1
这个不起作用,因为Lukas G.在早于你的已接受答案中指出了原因。 - andyn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接