Сообщить об ошибке.

Форматирование трассировок и исключений модулем traceback в Python

Функции форматирования трассировки и исключения

В разделе рассмотрены функции модуля traceback, предназначенные для форматирования информации об исключениях и записей трассировки стека.

Содержание:


traceback.format_list(extracted_list):

Функция traceback.format_list() возвращает список строк, готовых к печати при этом учитывает список кортежей или объектов FrameSummary, возвращенных функцией traceback.extract_tb() или traceback.extract_stack().

Каждая строка в результирующем списке соответствует элементу с тем же индексом в списке аргументов.. Каждая строка заканчивается символом новой строки '\n'.

Строки могут также содержать внутренние символы новой строки для тех элементов, у которых строка исходного текста не равна None.

traceback.format_exception_only(etype, value):

Функция traceback.format_exception_only() форматирует только информацию об исключении, извлеченную из трассировки.

Аргументы - это тип и значение исключения, такие как sys.last_type и sys.last_value.

Возвращаемое значение - это список строк, каждая из которых заканчивается символом новой строки '\n'. Обычно список состоит из одной строки. Однако для исключений SyntaxError он содержит несколько строк, которые (при печати) отображают подробную информацию о том, где произошла синтаксическая ошибка.

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

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

Функция traceback.format_exception() форматирует трассировку стека и информацию об исключении.

Аргументы имеют то же значение, что и соответствующие аргументы функции traceback.print_exception().

Возвращаемое значение - это список строк, каждая из которых заканчивается символом новой строки '\n', а некоторые содержат внутренние символы новой строки. Когда эти строки объединяются и печатаются, то печатается точно такой же текст, как и traceback.print_exception().

traceback.format_tb(tb, limit=None):

Функция traceback.format_tb() представляет собой сокращение для функции traceback.format_list(), и вызывается с параметрами:

traceback.format_list(traceback.extract_tb(tb, limit))

traceback.format_stack(f=None, limit=None):

Функция traceback.format_stack() представляет собой сокращение для функции traceback.format_list(), и вызывается с параметрами:

traceback.format_list(traceback.extract_stack(f, limit))

Примеры форматирования исключений и записей трассировки:

В примере наглядно демонстрируются различные способы форматирования исключения и обратной трассировки:

# test.py
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("*** format_exception:")
    # exc_type below is ignored on 3.5 and later
    print(repr(traceback.format_exception(exc_type, exc_value,
                                          exc_traceback)))
    print("*** format_tb:")
    print(repr(traceback.format_tb(exc_traceback)))
    print("*** tb_lineno:", exc_traceback.tb_lineno)


# *** format_exception:
# ['Traceback (most recent call last):\n',
#  '  File "<test...>", line 10, in <module>\n    lumberjack()\n',
#  '  File "<test...>", line 4, in lumberjack\n    bright_side_of_death()\n',
#  '  File "<test...>", line 7, in bright_side_of_death\n    return tuple()[0]\n',
#  'IndexError: tuple index out of range\n']
#  *** format_tb:
# ['  File "<test...>", line 10, in <module>\n    lumberjack()\n',
#  '  File "<test...>", line 4, in lumberjack\n    bright_side_of_death()\n',
#  '  File "<test...>", line 7, in bright_side_of_death\n    return tuple()[0]\n']
#  *** tb_lineno: 10

Пример демонстрирует последние несколько функций форматирования:

>>> 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']