traceback
— Распечатайте или извлеките обратную трассировку стека¶
Исходный код: Lib/traceback.py
Этот модуль предоставляет стандартный интерфейс для извлечения, форматирования и печати трассировок стека программ на Python. Он в точности имитирует поведение интерпретатора Python при печати трассировки стека. Это полезно, когда вы хотите напечатать трассировки стека под управлением программы, например, в «оболочке» вокруг интерпретатора.
Модуль использует traceback objects — это объекты типа types.TracebackType
, которые присваиваются полю __traceback__
экземпляров BaseException
.
См.также
- Модуль
faulthandler
Используется для явного сброса данных трассировки Python при сбое, по истечении таймаута или по сигналу пользователя.
- Модуль
pdb
Интерактивный отладчик исходного кода для программ на Python.
Модуль определяет следующие функции:
- traceback.print_tb(tb, limit=None, file=None)¶
Печатайте до limit записей трассировки стека, начиная с traceback object tb (начиная с кадра вызывающего объекта), если значение limit положительное. В противном случае, печатайте последние
abs(limit)
записи. Если значение limit опущено илиNone
, печатаются все записи. Если значение file опущено илиNone
, то выводится значениеsys.stderr
; в противном случае для получения выходных данных должно быть открыто значение file или file-like object.Изменено в версии 3.5: Добавлена поддержка отрицательных * ограничений*.
- traceback.print_exception(exc, /, [value, tb, ]limit=None, file=None, chain=True)¶
Распечатайте информацию об исключении и записи трассировки стека из traceback object tb в файл. Это отличается от
print_tb()
следующими способами:если tb не является
None
, он выводит заголовокTraceback (most recent call last):
он выводит тип исключения и значение после трассировки стека
если type(value) равен
SyntaxError
и value имеет соответствующий формат, то выводится строка, в которой произошла синтаксическая ошибка, с курсором, указывающим приблизительное местоположение ошибки.
Начиная с версии Python 3.10, вместо передачи value и tb в качестве первого аргумента может быть передан объект exception. Если указаны value и tb, первый аргумент игнорируется для обеспечения обратной совместимости.
Необязательный аргумент limit имеет то же значение, что и для
print_tb()
. Если значение chain равно true (значение по умолчанию), то также будут напечатаны связанные исключения (атрибуты исключения__cause__
или__context__
), как это делает сам интерпретатор при печати необработанного исключения.Изменено в версии 3.5: Аргумент etype игнорируется и выводится из типа value.
Изменено в версии 3.10: Параметр etype был переименован в exc и теперь предназначен только для определения местоположения.
- traceback.print_exc(limit=None, file=None, chain=True)¶
Это сокращение от
print_exception(sys.exception(), limit, file, chain)
.
- traceback.print_last(limit=None, file=None, chain=True)¶
Это сокращение от
print_exception(sys.last_type, sys.last_value, sys.last_traceback, limit, file, chain)
. В общем, это сработает только после того, как исключение достигнет интерактивного запроса (см.sys.last_type
).
- traceback.print_stack(f=None, limit=None, file=None)¶
Печатайте записи трассировки стека до limit (начиная с точки вызова), если значение limit положительное. В противном случае печатайте последние записи
abs(limit)
. Если значение limit опущено илиNone
, печатаются все записи. Необязательный аргумент f можно использовать для указания альтернативного stack frame для запуска. Необязательный аргумент file имеет то же значение, что и дляprint_tb()
.Изменено в версии 3.5: Добавлена поддержка отрицательных * ограничений*.
- traceback.extract_tb(tb, limit=None)¶
Возвращает объект
StackSummary
, представляющий список «предварительно обработанных» записей трассировки стека, извлеченных из traceback object tb. Это полезно для альтернативного форматирования трассировок стека. Необязательный аргумент limit имеет то же значение, что и дляprint_tb()
. «Предварительно обработанная» запись трассировки стека - это объектFrameSummary
, содержащий атрибутыfilename
,lineno
,name
, иline
, представляющие информацию, которая обычно выводится на печать для трассировки стека.
- traceback.extract_stack(f=None, limit=None)¶
Извлеките исходную трассировку из текущего stack frame. Возвращаемое значение имеет тот же формат, что и для
extract_tb()
. Необязательные аргументы f и limit имеют то же значение, что и дляprint_stack()
.
- traceback.format_list(extracted_list)¶
При наличии списка кортежей или объектов
FrameSummary
, возвращаемого с помощьюextract_tb()
илиextract_stack()
, возвращает список строк, готовых к печати. Каждая строка в результирующем списке соответствует элементу с таким же индексом в списке аргументов. Каждая строка заканчивается новой строкой; строки также могут содержать внутренние новые строки для тех элементов, исходная текстовая строка которых не являетсяNone
.
- traceback.format_exception_only(exc, /[, value])¶
Отформатируйте исключительную часть обратной трассировки, используя значение исключения, например,
sys.last_value
. Возвращаемое значение представляет собой список строк, каждая из которых заканчивается новой строкой. Список содержит сообщение об исключении, которое обычно представляет собой одну строку; однако для исключенийSyntaxError
он содержит несколько строк, которые (при печати) отображают подробную информацию о том, где произошла синтаксическая ошибка. Следующий за сообщением список содержитnotes
исключения.Начиная с версии Python 3.10, вместо передачи value в качестве первого аргумента может быть передан объект exception. Если указано value, первый аргумент игнорируется для обеспечения обратной совместимости.
Изменено в версии 3.10: Параметр etype был переименован в exc и теперь предназначен только для определения местоположения.
Изменено в версии 3.11: Возвращаемый список теперь включает все
notes
, присоединенные к исключению.
- traceback.format_exception(exc, /, [value, tb, ]limit=None, chain=True)¶
Отформатируйте трассировку стека и информацию об исключении. Аргументы имеют то же значение, что и соответствующие аргументы для
print_exception()
. Возвращаемое значение представляет собой список строк, каждая из которых заканчивается новой строкой, а некоторые содержат внутренние новые строки. Когда эти строки объединяются и печатаются, выводится точно такой же текст, как иprint_exception()
.Изменено в версии 3.5: Аргумент etype игнорируется и выводится из типа value.
Изменено в версии 3.10: Поведение и сигнатура этой функции были изменены, чтобы соответствовать
print_exception()
.
- traceback.format_exc(limit=None, chain=True)¶
Это похоже на
print_exc(limit)
, но возвращает строку вместо печати в файл.
- traceback.format_tb(tb, limit=None)¶
Сокращение от
format_list(extract_tb(tb, limit))
.
- traceback.format_stack(f=None, limit=None)¶
Сокращение от
format_list(extract_stack(f, limit))
.
- traceback.clear_frames(tb)¶
Очищает локальные переменные всех фреймов стека в traceback tb, вызывая метод
clear()
для каждого frame object.Добавлено в версии 3.4.
- traceback.walk_stack(f)¶
Пройдите по стеку, следующему за
f.f_back
, начиная с данного кадра, и укажите номер кадра и строки для каждого кадра. Если f равноNone
, используется текущий стек. Этот вспомогательный элемент используется сStackSummary.extract()
.Добавлено в версии 3.5.
- traceback.walk_tb(tb)¶
Выполните обратную трассировку, следуя
tb_next
, и получите номер кадра и строки для каждого кадра. Этот вспомогательный элемент используется сStackSummary.extract()
.Добавлено в версии 3.5.
Модуль также определяет следующие классы:
TracebackException
Объекты¶
Добавлено в версии 3.5.
TracebackException
объекты создаются на основе реальных исключений для упрощенного сбора данных для последующей печати.
- class traceback.TracebackException(exc_type, exc_value, exc_traceback, *, limit=None, lookup_lines=True, capture_locals=False, compact=False, max_group_width=15, max_group_depth=10)¶
Зафиксируйте исключение для последующего рендеринга. Области limit, lookup_lines и capture_locals для класса
StackSummary
.Если значение compact равно true, то в атрибутах класса сохраняются только те данные, которые требуются для метода
TracebackException
format()
. В частности, поле__context__
вычисляется только в том случае, если__cause__
равноNone
, а__suppress_context__
равно false.Обратите внимание, что при захвате локальных объектов они также отображаются в обратной трассировке.
max_group_width и max_group_depth управляют форматированием групп исключений (см.
BaseExceptionGroup
). Глубина относится к уровню вложенности группы, а ширина - к размеру массива исключений отдельной группы исключений. При превышении любого из этих ограничений форматированный вывод будет обрезан.Изменено в версии 3.10: Добавлен параметр compact.
Изменено в версии 3.11: Добавлены параметры max_group_width и max_group_depth.
- __context__¶
A
TracebackException
от исходного__context__
.
- exceptions¶
Если
self
представляет собойExceptionGroup
, то в этом поле содержится списокTracebackException
экземпляров, представляющих вложенные исключения. В противном случае этоNone
.Добавлено в версии 3.11.
- __suppress_context__¶
Значение
__suppress_context__
из исходного исключения.
- __notes__¶
Значение
__notes__
из исходного исключения илиNone
, если исключение не содержит никаких примечаний. Если это неNone
, то отформатировано ли оно в обратной трассировке после строки исключения?Добавлено в версии 3.11.
- stack¶
Символ
StackSummary
, представляющий обратную трассировку.
- exc_type¶
Класс исходной трассировки.
- filename¶
Для синтаксических ошибок - имя файла, в котором произошла ошибка.
- lineno¶
Для синтаксических ошибок - номер строки, в которой произошла ошибка.
- end_lineno¶
Для синтаксических ошибок - номер конечной строки, в которой произошла ошибка. Может быть
None
, если отсутствует.Добавлено в версии 3.10.
- text¶
Для синтаксических ошибок - текст, в котором произошла ошибка.
- offset¶
Для синтаксических ошибок - смещение в тексте, где произошла ошибка.
- end_offset¶
Для синтаксических ошибок - конечное смещение в тексте, где произошла ошибка. Может быть
None
, если отсутствует.Добавлено в версии 3.10.
- msg¶
При синтаксических ошибках - сообщение об ошибке компилятора.
- classmethod from_exception(exc, *, limit=None, lookup_lines=True, capture_locals=False)¶
Зафиксируйте исключение для последующего рендеринга. Области limit, lookup_lines и capture_locals для класса
StackSummary
.Обратите внимание, что при захвате локальных объектов они также отображаются в обратной трассировке.
- print(*, file=None, chain=True)¶
Выведите в файл (по умолчанию
sys.stderr
) информацию об исключении, возвращаемуюformat()
.Добавлено в версии 3.11.
- format(*, chain=True)¶
Отформатируйте исключение.
Если цепочка не
True
,__cause__
и__context__
не будут отформатированы.Возвращаемое значение представляет собой генератор строк, каждая из которых заканчивается новой строкой, а некоторые содержат внутренние новые строки.
print_exception()
- это оболочка для этого метода, которая просто печатает строки в файл.
- format_exception_only()¶
Отформатируйте исключительную часть обратной трассировки.
Возвращаемое значение представляет собой генератор строк, каждая из которых заканчивается новой строкой.
Генератор выдает сообщение об исключении, за которым следуют примечания (если таковые имеются). Сообщение об исключении обычно представляет собой одну строку; однако для исключений
SyntaxError
оно состоит из нескольких строк, которые (при печати) отображают подробную информацию о том, где произошла синтаксическая ошибка.Изменено в версии 3.11: Значения исключения
notes
теперь включены в выходные данные.
StackSummary
Объекты¶
Добавлено в версии 3.5.
StackSummary
объекты представляют собой стек вызовов, готовый к форматированию.
- class traceback.StackSummary¶
- classmethod extract(frame_gen, *, limit=None, lookup_lines=True, capture_locals=False)¶
Создайте объект
StackSummary
из генератора фреймов (например, возвращаемыйwalk_stack()
илиwalk_tb()
).Если указано значение limit, то из frame_gen берется только это количество кадров. Если значение lookup_lines равно
False
, возвращаемые объектыFrameSummary
еще не прочитали свои строки, что удешевляет стоимость созданияStackSummary
(что может оказаться полезным, если они на самом деле не будут отформатированы). Если значение capture_locals равноTrue
, то локальные переменные в каждомFrameSummary
записываются как представления объектов.
- classmethod from_list(a_list)¶
Создайте объект
StackSummary
из предоставленного списка объектовFrameSummary
или списка кортежей старого образца. Каждый кортеж должен состоять из 4 элементов с filename, lineno, name, line в качестве элементов.
- format()¶
Возвращает список строк, готовых к печати. Каждая строка в результирующем списке соответствует одному frame из стека. Каждая строка заканчивается новой строкой; строки также могут содержать внутренние переводы строк для элементов, содержащих строки исходного текста.
Для длинных последовательностей одного и того же кадра и строки показываются первые несколько повторений, за которыми следует итоговая строка с указанием точного количества последующих повторений.
Изменено в версии 3.6: Длинные последовательности повторяющихся кадров теперь сокращены.
- format_frame_summary(frame_summary)¶
Возвращает строку для печати одного из frames, включенных в стек. Этот метод вызывается для каждого
FrameSummary
объекта, который должен быть напечатан с помощьюStackSummary.format()
. Если он возвращаетNone
, то кадр исключается из выходных данных.Добавлено в версии 3.11.
FrameSummary
Объекты¶
Добавлено в версии 3.5.
Объект FrameSummary
представляет собой отдельный frame в traceback.
- class traceback.FrameSummary(filename, lineno, name, lookup_line=True, locals=None, line=None)¶
Представляет собой отдельный frame в traceback или в стеке, который форматируется или печатается. При желании в него может быть включена строковая версия локальных данных фрейма. Если значение lookup_line равно
False
, поиск исходного кода не выполняется до тех пор, пока вFrameSummary
не будет получен доступ к атрибутуline
(что также происходит при приведении его кtuple
).line
может быть предоставлено напрямую и вообще предотвратит поиск строк. locals - это необязательный словарь локальных переменных, и если он указан, то представления переменных сохраняются в сводке для последующего отображения.FrameSummary
экземпляры имеют следующие атрибуты:- filename¶
Имя файла исходного кода для этого фрейма. Эквивалентно доступу к
f.f_code.co_filename
на frame object f.
- lineno¶
Номер строки исходного кода для этого фрейма.
- name¶
Эквивалентно доступу к
f.f_code.co_name
на frame object f.
- line¶
Строка, представляющая исходный код для этого фрейма, без начальных и конечных пробелов. Если исходный код недоступен, это
None
.
Примеры обратной трассировки¶
В этом простом примере реализован базовый цикл чтения-оценки-печати, аналогичный стандартному циклу интерактивного интерпретатора Python (но менее полезный, чем он). Для более полной реализации цикла интерпретатора обратитесь к модулю code
.
import sys, traceback
def run_user_code(envdir):
source = input(">>> ")
try:
exec(source, envdir)
except Exception:
print("Exception in user code:")
print("-"*60)
traceback.print_exc(file=sys.stdout)
print("-"*60)
envdir = {}
while True:
run_user_code(envdir)
В следующем примере показаны различные способы печати и форматирования исключения и обратной трассировки:
import sys, traceback
def lumberjack():
bright_side_of_life()
def bright_side_of_life():
return tuple()[0]
try:
lumberjack()
except IndexError:
exc = sys.exception()
print("*** print_tb:")
traceback.print_tb(exc.__traceback__, limit=1, file=sys.stdout)
print("*** print_exception:")
traceback.print_exception(exc, limit=2, file=sys.stdout)
print("*** print_exc:")
traceback.print_exc(limit=2, file=sys.stdout)
print("*** format_exc, first and last line:")
formatted_lines = traceback.format_exc().splitlines()
print(formatted_lines[0])
print(formatted_lines[-1])
print("*** format_exception:")
print(repr(traceback.format_exception(exc)))
print("*** extract_tb:")
print(repr(traceback.extract_tb(exc.__traceback__)))
print("*** format_tb:")
print(repr(traceback.format_tb(exc.__traceback__)))
print("*** tb_lineno:", exc.__traceback__.tb_lineno)
Выходные данные для этого примера будут выглядеть примерно так:
*** print_tb:
File "<doctest...>", line 10, in <module>
lumberjack()
*** print_exception:
Traceback (most recent call last):
File "<doctest...>", line 10, in <module>
lumberjack()
File "<doctest...>", line 4, in lumberjack
bright_side_of_life()
IndexError: tuple index out of range
*** print_exc:
Traceback (most recent call last):
File "<doctest...>", line 10, in <module>
lumberjack()
File "<doctest...>", line 4, in lumberjack
bright_side_of_life()
IndexError: tuple index out of range
*** format_exc, first and last line:
Traceback (most recent call last):
IndexError: tuple index out of range
*** format_exception:
['Traceback (most recent call last):\n',
' File "<doctest default[0]>", line 10, in <module>\n lumberjack()\n',
' File "<doctest default[0]>", line 4, in lumberjack\n bright_side_of_life()\n',
' File "<doctest default[0]>", line 7, in bright_side_of_life\n return tuple()[0]\n ~~~~~~~^^^\n',
'IndexError: tuple index out of range\n']
*** extract_tb:
[<FrameSummary file <doctest...>, line 10 in <module>>,
<FrameSummary file <doctest...>, line 4 in lumberjack>,
<FrameSummary file <doctest...>, line 7 in bright_side_of_life>]
*** format_tb:
[' File "<doctest default[0]>", line 10, in <module>\n lumberjack()\n',
' File "<doctest default[0]>", line 4, in lumberjack\n bright_side_of_life()\n',
' File "<doctest default[0]>", line 7, in bright_side_of_life\n return tuple()[0]\n ~~~~~~~^^^\n']
*** tb_lineno: 10
В следующем примере показаны различные способы печати и форматирования стопки:
>>> import traceback
>>> def another_function():
... lumberstack()
...
>>> def lumberstack():
... traceback.print_stack()
... print(repr(traceback.extract_stack()))
... print(repr(traceback.format_stack()))
...
>>> another_function()
File "<doctest>", line 10, in <module>
another_function()
File "<doctest>", line 3, in another_function
lumberstack()
File "<doctest>", line 6, in lumberstack
traceback.print_stack()
[('<doctest>', 10, '<module>', 'another_function()'),
('<doctest>', 3, 'another_function', 'lumberstack()'),
('<doctest>', 7, 'lumberstack', 'print(repr(traceback.extract_stack()))')]
[' File "<doctest>", line 10, in <module>\n another_function()\n',
' File "<doctest>", line 3, in another_function\n lumberstack()\n',
' File "<doctest>", line 8, in lumberstack\n print(repr(traceback.format_stack()))\n']
Этот последний пример демонстрирует несколько последних функций форматирования:
>>> import traceback
>>> traceback.format_list([('spam.py', 3, '<module>', 'spam.eggs()'),
... ('eggs.py', 42, 'eggs', 'return "bacon"')])
[' File "spam.py", line 3, in <module>\n spam.eggs()\n',
' File "eggs.py", line 42, in eggs\n return "bacon"\n']
>>> an_error = IndexError('tuple index out of range')
>>> traceback.format_exception_only(type(an_error), an_error)
['IndexError: tuple index out of range\n']