如何在Python中以编程方式检查异常的堆栈跟踪?

20 投票
5 回答
14935 浏览
提问于 2025-04-15 19:53

在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)
6

你可以使用 inspect 模块,它里面有一些很有用的功能,可以帮助你追踪程序的运行情况。可以看看 帧对象的属性概述,了解这些帧对象的特点。

撰写回答