13

我对两个对象之间的区别感到困惑:

  • inspect.trace()处理异常时返回的帧列表
  • sys.exc_info()[2]由(或在调用中传递给sys.excepthook)返回的回溯

这两个对象是否包含相同的信息,只是组织成不同的数据结构?如果没有,什么是另一个没有的?

4

1 回答 1

8

从 inspect.trace 的文档中:

检查。跟踪([上下文])

返回当前帧与引发当前正在处理的异常的帧之间的堆栈的帧记录列表。列表中的第一个条目表示调用者;最后一个条目表示引发异常的位置。

这表明它提供了一种很好的方法来分割和切分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.22.7相同),这正是它所做的,但它通过getinnerframes,它根据文档字符串用一些有用的信息对其进行注释:

获取回溯帧和所有较低帧的记录列表。

每条记录都包含一个框架对象、文件名、行号、函数名、上下文行列表和上下文中的索引。

而且,因为我很好奇这实际上意味着什么:

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()显然更好一点。

于 2012-04-11T23:36:02.107 回答