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.

__cause__

A TracebackException от исходного __cause__.

__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']
Вернуться на верх