Документация Python неофициальный перевод
Содержание страницы

traceback – печать или получение трассировки стекаtraceback – Print or retrieve a stack traceback

Исходный код: Lib/traceback.py


Этот модуль предоставляет стандартный интерфейс для извлечения, форматирования и печати трассировок стека программ Python. Он в точности повторяет поведение интерпретатора Python при печати трассировки стека. Это полезно, когда требуется печатать трассировки стека программно, например, в «обёртке» вокруг интерпретатора.

Модуль использует объекты traceback – это тип объекта, который хранится в переменной sys.last_traceback и возвращается как третий элемент из sys.exc_info().

См. также

Модуль faulthandler

Используется для явного дампа трассировок Python при сбое, по таймауту или по сигналу пользователя.

Модуль pdb

Интерактивный отладчик исходного кода для программ на Python.

Модуль определяет следующие функции:

traceback.print_tb(tb, limit=None, file=None)

Печатает до limit записей трассировки стека из объекта traceback tb (начиная с фрейма вызывающего), если limit положительный. В противном случае печатает последние abs(limit) записей. Если limit опущен или равен None, печатаются все записи. Если file опущен или равен None, вывод направляется в sys.stderr; в противном случае это должен быть открытый файл или файлоподобный объект для получения вывода.

Изменено в версии 3.5: Добавлена поддержка отрицательного значения limit.

traceback.print_exception(exc, /, [value, tb, ]limit=None, file=None, chain=True)

Печатает информацию об исключении и записи трассировки стека из объекта traceback tb в file. Отличается от print_tb() следующим образом:

  • если tb не равен None, выводится заголовок Traceback (most recent call last):

  • он выводит тип исключения и value после трассировки стека

  • если type(value) равен SyntaxError и value имеет соответствующий формат, выводится строка, в которой произошла синтаксическая ошибка, с символом «^», указывающим приблизительную позицию ошибки.

Начиная с Python 3.10, вместо передачи value и tb первым аргументом можно передавать объект исключения. Если value и tb указаны, первый аргумент игнорируется для обеспечения обратной совместимости.

Необязательный аргумент limit имеет то же значение, что и для print_tb(). Если chain истинно (по умолчанию), то цепочка исключений (атрибуты __cause__ или __context__ исключения) также будет выведена на печать, как это делает сам интерпретатор при печати необработанного исключения.

Изменено в версии 3.5: Аргумент etype игнорируется и определяется по типу value.

Изменено в версии 3.10: Параметр etype переименован в exc и теперь является только позиционным.

traceback.print_exc(limit=None, file=None, chain=True)

Это сокращение для print_exception(*sys.exc_info(), 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 можно использовать для указания альтернативного стекового фрейма для начала. Необязательный аргумент file имеет то же значение, что и для print_tb().

Изменено в версии 3.5: Добавлена поддержка отрицательного значения limit.

traceback.extract_tb(tb, limit=None)

Возвращает объект StackSummary, представляющий список «предварительно обработанных» записей трассировки стека, извлечённых из объекта traceback tb. Полезно для альтернативного форматирования трассировок стека. Необязательный аргумент limit имеет то же значение, что и для print_tb(). «Предварительно обработанная» запись трассировки стека – это объект FrameSummary, содержащий атрибуты filename, lineno, name и line, представляющие информацию, которая обычно печатается для трассировки стека. line – это строка с удалёнными начальными и конечными пробелами; если исходный код недоступен, она равна None.

traceback.extract_stack(f=None, limit=None)

Извлекает необработанную трассировку из текущего стекового фрейма. Возвращаемое значение имеет тот же формат, что и для 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 он содержит несколько строк, которые (при печати) отображают подробную информацию о том, где произошла синтаксическая ошибка. Сообщение, указывающее, какое именно исключение произошло, всегда является последней строкой в списке.

Начиная с Python 3.10, вместо передачи value в качестве первого аргумента можно передавать объект исключения. Если передан value, первый аргумент игнорируется для обеспечения обратной совместимости.

Изменено в версии 3.10: Параметр etype переименован в exc и теперь является только позиционным.

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)

Очищает локальные переменные всех стековых фреймов в трассировке tb, вызывая метод clear() каждого объекта фрейма.

Новое в версии 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 ОбъектыTracebackException Objects

Новое в версии 3.5.

Объекты TracebackException создаются на основе реальных исключений для сохранения данных для последующей печати в облегчённом виде.

class traceback.TracebackException(exc_type, exc_value, exc_traceback, *, limit=None, lookup_lines=True, capture_locals=False, compact=False)

Захватывает исключение для последующего отображения. Параметры limit, lookup_lines и capture_locals такие же, как для класса StackSummary.

Если compact истинно, в атрибутах класса сохраняются только данные, необходимые методу format класса TracebackException. В частности, поле __context__ вычисляется только если __cause__ равно None, а __suppress_context__ ложно.

Обратите внимание, что при захвате локальных переменных они также отображаются в трассировке.

__cause__

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

__context__

TracebackException исходного __context__.

__suppress_context__

Значение __suppress_context__ из исходного исключения.

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.

Обратите внимание, что при захвате локальных переменных они также отображаются в трассировке.

format(*, chain=True)

Форматирует исключение.

Если chain не True, то __cause__ и __context__ не будут отформатированы.

Возвращаемое значение – генератор строк, каждая из которых завершается символом новой строки, и некоторые содержат внутренние переводы строк. print_exception() является обёрткой вокруг этого метода, которая просто выводит строки в файл.

Сообщение о произошедшем исключении всегда находится в последней строке вывода.

format_exception_only()

Форматирует часть трассировки, относящуюся к исключению.

Возвращаемое значение – генератор строк, каждая из которых завершается символом новой строки.

Обычно генератор выдает одну строку; однако для исключений SyntaxError он выдает несколько строк, которые (при печати) отображают подробную информацию о том, где произошла синтаксическая ошибка.

Сообщение о произошедшем исключении всегда находится в последней строке вывода.

Изменено в версии 3.10: Добавлен параметр compact.

StackSummary ОбъектыStackSummary Objects

Новое в версии 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()

Возвращает список строк, готовых к печати. Каждая строка в результирующем списке соответствует одному фрейму из стека. Каждая строка заканчивается переводом строки; строки могут также содержать внутренние переводы строк для элементов с исходным текстом.

Для длинных последовательностей одинаковых фреймов и строк сначала показываются первые несколько повторений, а затем сводная строка с указанием точного числа последующих повторений.

Изменено в версии 3.6: Длинные последовательности повторяющихся фреймов теперь сокращаются.

FrameSummary ОбъектыFrameSummary Objects

Новое в версии 3.5.

Объекты FrameSummary представляют один фрейм в traceback.

class traceback.FrameSummary(filename, lineno, name, lookup_line=True, locals=None, line=None)

Представляет один фрейм в traceback или стеке, который форматируется или выводится на печать. При желании может содержать строковое представление локальных переменных фрейма. Если lookup_line равен False, исходный код не ищется до тех пор, пока у FrameSummary не будет получен доступ к атрибуту line (что также происходит при преобразовании в кортеж). line может быть предоставлен напрямую, что полностью предотвратит поиск строк. locals – это необязательный словарь локальных переменных; если он указан, представления переменных сохраняются в сводке для последующего отображения.

Примеры tracebackTraceback Examples

Этот простой пример реализует базовый цикл чтение-вычисление-печать, похожий на (но менее полезный, чем) стандартный цикл интерактивного интерпретатора 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_type, exc_value, exc_traceback = sys.exc_info()
    print("*** print_tb:")
    traceback.print_tb(exc_traceback, limit=1, file=sys.stdout)
    print("*** print_exception:")
    traceback.print_exception(exc_value, 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_value)))
    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...>", line 10, in <module>\n    lumberjack()\n',
 '  File "<doctest...>", line 4, in lumberjack\n    bright_side_of_life()\n',
 '  File "<doctest...>", line 7, in bright_side_of_life\n    return tuple()[0]\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...>", line 10, in <module>\n    lumberjack()\n',
 '  File "<doctest...>", line 4, in lumberjack\n    bright_side_of_life()\n',
 '  File "<doctest...>", line 7, in bright_side_of_life\n    return tuple()[0]\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']