当Python中发生异常时,您可以检查堆栈吗?你能确定它的深度吗?我查看了traceback模块,但我无法弄清楚如何使用它。
我的目标是捕获在解析eval表达式期间发生的任何异常,而不会捕获它可能调用的任何函数抛出的异常。不要因为使用eval而责备我。这不是我的决定。
注意:我想以编程方式而不是以交互方式执行此操作。
答案 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.
答案 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
中的源代码可以帮助您学习如何执行此类操作。