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

时间:2010-03-01 21:37:14

标签: python exception-handling stack-trace traceback

当Python中发生异常时,您可以检查堆栈吗?你能确定它的深度吗?我查看了traceback模块,但我无法弄清楚如何使用它。

我的目标是捕获在解析eval表达式期间发生的任何异常,而不会捕获它可能调用的任何函数抛出的异常。不要因为使用eval而责备我。这不是我的决定。

注意:我想以编程方式而不是以交互方式执行此操作。

5 个答案:

答案 0 :(得分:14)

traceback就足够了 - 我认为文档描述得相当好。简化示例:

import sys
import traceback

try:
    eval('a')
except NameError:
    traceback.print_exc(file=sys.stdout)

答案 1 :(得分:6)

您可以使用具有一些实用功能的inspect模块进行跟踪。看一下框架对象的overview of properties

答案 2 :(得分:4)

我喜欢追溯模块。

您可以使用sys.exc_info()获取追溯对象。然后,您可以使用该对象使用traceback.extract_tb()获取列表预处理的回溯条目列表。然后,您可以使用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

和追溯模块:http://docs.python.org/library/traceback.html

答案 3 :(得分:1)

您定义了这样一个函数(doc here):

def raiseErr():
   for f in inspect.stack(): print '-', inspect.getframeinfo(f[0])

并从您的模块中调用它:

raiseErr()

函数 raiseErr 将打印有关您调用它的地方的信息。

更详细,你可以这样做:

import inspect, traceback
A = [inspect.getframeinfo(f[0]) for f in inspect.stack()]
print "traceback structure fields:", filter(lambda s: s[0] != '_', dir(A[0]))
print A[0].filename, A[0].lineno
for f in inspect.stack():
    F = inspect.getframeinfo(f[0])
    print '-', F.filename, F.lineno, '\t', F.code_context[0].strip()

其他可能性是定义此功能:

def tr():
    print '* - '*10,
    print sys._getframe(1).f_code.co_name

并在您想要跟踪的地方调用它。如果您想要所有跟踪,请在_getframe(1)中从1开始创建迭代器。

答案 4 :(得分:0)

除了AndiDog关于inspect的回答之外,请注意pdb可让您在堆栈中上下移动,检查当地人等。标准库pdb.py中的源代码可以帮助您学习如何执行此类操作。