В разделе рассмотрены функции модуля traceback
, предназначенные для форматирования информации об исключениях и записей трассировки стека.
traceback.format_list()
- список строк, готовых к печати,traceback.format_exception_only()
- форматирует только исключение,traceback.format_exception()
- форматирует трассировку и исключение,traceback.format_tb()
- сокращение для traceback.format_list()
,traceback.format_stack()
- еще одно сокращение для traceback.format_list()
,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']