我对两个物体之间的区别感到困惑:
inspect.trace()在处理异常时返回的帧列表sys.exc_info()[2]返回的跟踪(或在对sys.excepthook的调用中传递)这两个对象是否包含相同的信息,只是组织成不同的数据结构?如果没有,另一个没有的是什么?
发布于 2012-04-11 23:36:02
来自inspect.trace的文档:
inspect.trace(context) 返回当前帧与当前正在处理异常的帧之间的堆栈的帧记录列表。列表中的第一个条目表示调用方;最后一个条目表示异常发生的位置。
这表明它提供了一种很好的方法,可以从sys.exc_info()[2]获得哪些帧进行切片和裁剪。
如果你看看消息来源:
def trace(context=1):
"""Return a list of records for the stack below the current exception."""
return getinnerframes(sys.exc_info()[2], context)(对于3.2或2.7,完全相同),这正是它所做的,但是它通过getinnerframes传递给它,getinnerframes给它加上了一些有用的信息,每个docstring:
获取跟踪帧和所有较低帧的记录列表。 每个记录包含一个框架对象、文件名、行号、函数名、上下文行列表和上下文中的索引。
而且,既然我很好奇这到底意味着什么
import sys
import inspect
from pprint import pprint
def errorer():
raise Exception('foo')
def syser():
try:
errorer()
except Exception, e:
tb = sys.exc_info()[2]
print tb.tb_frame
print tb.tb_lasti
print tb.tb_lineno
print tb.tb_next
def inspecter():
try:
errorer()
except Exception, e:
pprint(inspect.trace())当从提示符调用时,在回顾其中许多字段和对象都有很容易找到定义时:
>>> syser()
<frame object at 0x1441240>
6
10
<traceback object at 0x13eb3b0>
>>> inspecter()
[(<frame object at 0x14a5590>,
'/tmp/errors.py',
22,
'inspecter',
None,
None),
(<frame object at 0x14a21b0>,
'/tmp/errors.py',
8,
'errorer',
None,
None)](行号跳来跳去,因为我弄乱了格式)
inspect.trace()显然要好一点。
https://stackoverflow.com/questions/10115022
复制相似问题