`inspect.trace()` vs `traceback`

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

  • список кадров, возвращаемых inspect.trace() пока обрабатывается исключение
  • обратная связь возвращается sys.exc_info()[2] (или передается в вызове sys.excepthook)

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

1 ответ

Решение

Из документации 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.2 или 2.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() очевидно, немного лучше.

Другие вопросы по тегам