如何在Python中以编程方式检查异常的堆栈跟踪?
在Python中,当出现异常时,你能查看调用栈吗?你能知道它的深度吗?我查过traceback模块,但我不知道怎么用。
我的目标是在解析eval表达式时捕获任何异常,但不想捕获它可能调用的任何函数抛出的异常。别骂我用eval,这不是我自己决定的。
注意:我想以编程的方式来实现,而不是通过交互的方式。
5 个回答
5
我很喜欢 traceback 模块。
你可以通过 sys.exc_info()
来获取一个 traceback 对象。然后,你可以用这个对象通过 traceback.extract_tb()
来得到一个处理过的 traceback 条目列表。接着,你可以使用 traceback.format_list()
来获取一个更易读的列表,方法如下:
import sys
import traceback, inspect
try:
f = open("nonExistant file",'r')
except:
(exc_type, exc_value, exc_traceback) = sys.exc_info()
#print exception type
print exc_type
tb_list = traceback.extract_tb(sys.exc_info()[2])
tb_list = traceback.format_list(tb_list)
for elt in tb_list:
print elt
#Do any processing you need here.
查看 sys 模块:http://docs.python.org/library/sys.html
以及 traceback 模块:http://docs.python.org/library/traceback.html
14
traceback
就足够了,我想文档对它的描述也挺清楚的。这里有个简单的例子:
import sys
import traceback
try:
eval('a')
except NameError:
traceback.print_exc(file=sys.stdout)