当 Python 发生异常时,你能检查堆栈吗?你能确定它的深度吗?我查看了traceback模块,但我不知道如何使用它。
我的目标是捕获在解析 eval 表达式期间发生的任何异常,而不捕获它可能调用的任何函数引发的异常。不要因为我使用 eval 而责备我。这不是我的决定。
注意:我想以编程方式而不是交互方式执行此操作。
当 Python 发生异常时,你能检查堆栈吗?你能确定它的深度吗?我查看了traceback模块,但我不知道如何使用它。
我的目标是捕获在解析 eval 表达式期间发生的任何异常,而不捕获它可能调用的任何函数引发的异常。不要因为我使用 eval 而责备我。这不是我的决定。
注意:我想以编程方式而不是交互方式执行此操作。
traceback
就足够了 - 我认为文档描述得相当好。简化示例:
import sys
import traceback
try:
eval('a')
except NameError:
traceback.print_exc(file=sys.stdout)
我喜欢回溯模块。
您可以使用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
您定义了这样一个函数(此处的文档):
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)
.
除了 AndiDog 关于 的回答之外inspect
,请注意,它pdb
可以让您在堆栈中上下导航,检查本地人等。标准库中的源代码pdb.py
可能有助于您学习如何做这些事情。