如何将跟踪对象(sys.exc_info()[2]与sys.exc_traceback相同)作为字符串?

时间:2013-11-27 11:39:36

标签: python string data-conversion traceback string-conversion

我有一个捕获所有异常的函数,我希望能够在此函数中将回溯作为字符串获取。

到目前为止,这不起作用:

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模块吗?

根据this other vaguely similar question,我尝试过:

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'

2 个答案:

答案 0 :(得分:12)

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

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

print_tb()直接打印回溯,这就是为什么你得到None的结果(这是任何没有&的任何Python函数的默认值) #39; t明确地返回任何内容)。

答案 1 :(得分:-1)

  

traceback.format_exc([limit])
  这是like print_exc(limit)但是   返回一个字符串而不是打印到文件。

     

版本2.4中的新功能。

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