Вопрос по python – `inspect.trace ()` vs `traceback`

9

Я запутался в разнице между двумя объектами:

  • the list of frames returned by inspect.trace() while an exception is being handled
  • the traceback returned by sys.exc_info()[2] (or passed in the call to sys.excepthook)

Содержат ли два объекта одну и ту же информацию, просто организованную в разную структуру данных? Если нет, то что у того, что нет у другого?

Я пытался, но они не распечатывали себя (просто объект класса ...>). Поэтому я не мог понять, как выполнить этот тест. max
Вы рассматривали возможность использованияdir() по результатам? или жеhelp()? Karl Knechtel
Нет, я не думал об этом .... :( Я буду в будущем !! max
Почему бы и нетtest it подняв и поймав исключение, и отобразив результаты каждого? Karl Knechtel

Ваш Ответ

1   ответ
7

inspect.trace([context])

Return a list of frame records for the stack between the current frame and the frame in which an exception currently being handled was raised in. The first entry in the list represents the caller; the last entry represents where the exception was raised.

что говорит о том, что он обеспечивает хороший способ нарезать и нарезать, какие кадры из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, которая снабжает его полезной информацией, согласно строке документации:

Get a list of records for a traceback's frame and all lower frames.

Each record contains a frame object, filename, line number, function name, a list of lines of context, and index within the context.

И, поскольку мне интересно, что это на самом деле означает:

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() очевидно, немного лучше.

Похожие вопросы