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