20

当 Python 发生异常时,你能检查堆栈吗?你能确定它的深度吗?我查看了traceback模块,但我不知道如何使用它。

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

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

4

5 回答 5

15

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

import sys
import traceback

try:
    eval('a')
except NameError:
    traceback.print_exc(file=sys.stdout)
于 2010-03-01T22:20:14.337 回答
6

您可以使用具有一些实用功能的检查模块进行跟踪。查看框架对象的属性概述。

于 2010-03-01T21:43:51.407 回答
5

我喜欢回溯模块。

您可以使用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

于 2011-11-27T16:30:13.780 回答
2

您定义了这样一个函数(此处的文档):

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

并在您想要跟踪的地方调用它。如果您想要所有跟踪,请从 1 到_getframe(1).

于 2013-03-30T17:31:02.677 回答
0

除了 AndiDog 关于 的回答之外inspect,请注意,它pdb可以让您在堆栈中上下导航,检查本地人等。标准库中的源代码pdb.py可能有助于您学习如何做这些事情。

于 2010-03-02T02:09:13.947 回答