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

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

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

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

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

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

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

traceback.print_exception(type, value, traceback, limit=None, file=None, chain=True)

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

  • если traceback не равен None, выводится заголовок Traceback (most recent call last):
  • выводит тип исключения type и value после стековой трассировки
  • если typeSyntaxError, а value имеет соответствующий формат, то выводится строка с синтаксической ошибкой и символом «^», указывающим примерное положение ошибки.

If chain is true (the default), then chained exceptions (the __cause__ or __context__ attributes of the exception) will be printed as well, like the interpreter itself does when printing an unhandled exception.

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

Это сокращение для print_exception(*sys.exc_info()).

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

Это сокращение для print_exception(sys.last_type, sys.last_value, sys.last_traceback, limit, file). Обычно работает только после того, как исключение достигло интерактивного приглашения (см. sys.last_type).

traceback.print_stack(f=None, limit=None, file=None)

Эта функция выводит стековую трассировку начиная с точки вызова. Необязательный аргумент f позволяет указать альтернативный стековый кадр для начала. Необязательные аргументы limit и file имеют тот же смысл, что и для print_exception().

traceback.extract_tb(traceback, limit=None)

Возвращает список не более limit «предварительно обработанных» записей трассировки стека, извлеченных из объекта трассировки traceback. Полезно для альтернативного форматирования трассировок стека. Если limit опущен или None, извлекаются все записи. «Предварительно обработанная» запись трассировки стека – это четверка (filename, номер строки, имя функции, text), представляющая информацию, которая обычно выводится для трассировки стека. text – это строка с удаленными начальными и конечными пробелами; если исходный код недоступен, значением будет None.

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

Извлекает «сырую» трассировку из текущего стекового кадра. Возвращаемое значение имеет тот же формат, что и для extract_tb(). Необязательные аргументы f и limit имеют тот же смысл, что и для print_stack().

traceback.format_list(list)

По списку кортежей, возвращённому extract_tb() или extract_stack(), возвращает список строк, готовых к печати. Каждая строка в результирующем списке соответствует элементу с тем же индексом в исходном списке. Каждая строка заканчивается символом новой строки; строки могут также содержать внутренние символы новой строки для тех элементов, у которых текст исходной строки не равен None.

traceback.format_exception_only(type, value)

Форматирует часть трассировки, относящуюся к исключению. Аргументы – это tип исключения и его значение, например, из sys.last_type и sys.last_value. Возвращаемое значение – список строк, каждая заканчивается символом новой строки. Обычно список содержит одну строку; однако для исключений SyntaxError он содержит несколько строк, которые (при печати) отображают подробную информацию о том, где произошла синтаксическая ошибка. Сообщение, указывающее, какое именно исключение произошло, всегда является последней строкой в списке.

traceback.format_exception(type, value, tb, limit=None, chain=True)

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

27.9.1. Примеры tracebackTraceback Examples

Этот простой пример реализует базовый цикл read-eval-print, похожий на стандартный интерактивный цикл интерпретатора Python (но менее полезный). Для более полной реализации цикла интерпретатора обратитесь к модулю code.

import sys, traceback

def run_user_code(envdir):
    source = input(">>> ")
    try:
        exec(source, envdir)
    except:
        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_death()

def bright_side_of_death():
    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_type, exc_value, exc_traceback,
                              limit=2, file=sys.stdout)
    print("*** print_exc:")
    traceback.print_exc()
    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_type, exc_value,
                                          exc_traceback)))
    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_death()
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_death()
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_death()\n',
 '  File "<doctest...>", line 7, in bright_side_of_death\n    return tuple()[0]\n',
 'IndexError: tuple index out of range\n']
*** extract_tb:
[('<doctest...>', 10, '<module>', 'lumberjack()'),
 ('<doctest...>', 4, 'lumberjack', 'bright_side_of_death()'),
 ('<doctest...>', 7, 'bright_side_of_death', 'return tuple()[0]')]
*** format_tb:
['  File "<doctest...>", line 10, in <module>\n    lumberjack()\n',
 '  File "<doctest...>", line 4, in lumberjack\n    bright_side_of_death()\n',
 '  File "<doctest...>", line 7, in bright_side_of_death\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']