首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`inspect.trace()` vs‘`traceback`’

`inspect.trace()` vs‘`traceback`’
EN

Stack Overflow用户
提问于 2012-04-11 22:44:07
回答 1查看 3.1K关注 0票数 15

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-11 23:36:02

来自inspect.trace的文档:

inspect.trace(context) 返回当前帧与当前正在处理异常的帧之间的堆栈的帧记录列表。列表中的第一个条目表示调用方;最后一个条目表示异常发生的位置。

这表明它提供了一种很好的方法,可以从sys.exc_info()[2]获得哪些帧进行切片和裁剪。

如果你看看消息来源:

代码语言:javascript
复制
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传递给它,getinnerframes给它加上了一些有用的信息,每个docstring:

获取跟踪帧和所有较低帧的记录列表。 每个记录包含一个框架对象、文件名、行号、函数名、上下文行列表和上下文中的索引。

而且,既然我很好奇这到底意味着什么

代码语言:javascript
复制
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())

当从提示符调用时,在回顾其中许多字段和对象都有很容易找到定义时:

代码语言:javascript
复制
>>> 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()显然要好一点。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10115022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档