我在Python中看到了很多关于堆栈跟踪和异常的帖子 . 但还没找到我需要的东西 .
我有一大堆Python 2.7代码可能引发异常 . 我想 grab 它并分配给 string 它的完整描述和导致错误的堆栈跟踪(我们只是在控制台上看到的所有内容) . 我需要这个字符串将其打印到GUI中的文本框 .
像这样的东西:
try:
method_that_can_raise_an_exception(params)
except Exception as e:
print_to_textbox(complete_exception_description(e))
问题是: what is the function complete_exception_description?
8 回答
使用Python 3,以下代码将使用
traceback.format_exc()
完全按照格式获取Exception
对象:优点是只需要
Exception
对象(由于记录的__traceback__
属性),因此可以更容易地作为参数传递给另一个函数以进行进一步处理 .请参阅
traceback
模块,特别是format_exc()
函数 . Here .使用 sys.exc_info() 收集
traceback
模块中的信息和函数以对其进行格式化 . Here是格式化它的一些示例 .整个异常字符串位于:
要创建一个相当复杂的堆栈跟踪来演示我们获得完整的堆栈跟踪:
记录完整的堆栈跟踪
最佳做法是为模块设置 Logger . 它将知道模块的名称并能够更改级别(以及其他属性,例如处理程序)
我们可以使用此 Logger 来获取错误:
哪些日志:
所以我们得到的输出与出错时的输出相同:
获取字符串
如果你真的只想要字符串,请使用
traceback.format_exc
函数,演示如何在此处记录字符串:哪些日志:
对于那些使用 Python-3 的人
使用
traceback
模块和exception.__traceback__
可以提取堆栈跟踪,如下所示:使用
traceback.extract_stack()
抓取 current 堆栈跟踪删除最后三个元素(因为那些是堆栈中的条目让我进入我的调试功能)
使用
traceback.extract_tb()
从异常对象追加__traceback__
使用
traceback.format_list()
格式化全部内容一个简单的演示:
当我们调用
bar()
时,我们得到以下输出:您也可以考虑使用内置的Python模块cgitb来获得一些非常好的,格式良好的异常信息,包括局部变量值,源代码上下文,函数参数等 .
比如这个代码......
我们得到这个异常输出......
我的2美分:
我定义了以下助手类:
以后我可以这样使用:
以后可以像这样使用它:
(背景:由于将
Promise
与Exception
一起使用,我很沮丧,不幸的是,它将一个地方引发的异常传递给另一个地方的on_rejected处理程序,因此很难从原始位置获取回溯)