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, то в атрибутах класса сохраняются только те данные, которые требуются для метода
TracebackExceptionformat(). В частности, поле__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']