traceback
— Печать или получение обратного хода стека¶
Исходный код: Lib/traceback.py.
Этот модуль предоставляет стандартный интерфейс для извлечения, форматирования и печати трассировки стека программ Python. Он точно имитирует поведение интерпретатора Python при печати трассы стека. Это полезно, когда вы хотите печатать трассировку стека под контролем программы, например, в «обертке» вокруг интерпретатора.
Модуль использует объекты traceback — это тип объекта, который хранится в переменной sys.last_traceback
и возвращается как третий элемент из sys.exc_info()
.
Модуль определяет следующие функции:
-
traceback.
print_tb
(tb, limit=None, file=None)¶ Выведите до лимита записей трассировки стека из объекта трассировки tb (начиная с кадра вызывающей стороны), если лимит положителен. В противном случае, печатаются последние
abs(limit)
записи. Если limit опущен илиNone
, печатаются все записи. Если file опущен илиNone
, вывод идет вsys.stderr
; иначе это должен быть открытый файл или файлоподобный объект для получения вывода.Изменено в версии 3.5: Добавлена поддержка отрицательного лимита.
-
traceback.
print_exception
(exc, /, [value, tb, ]limit=None, file=None, chain=True)¶ Печать информации об исключении и записей трассировки стека из объекта трассировки tb в file. Это отличается от
print_tb()
следующим образом:если tb не
None
, то печатается заголовокTraceback (most recent call last):
печатает тип исключения и значение после трассировки стека
если type(value) равно
SyntaxError
и value имеет соответствующий формат, то печатается строка, в которой произошла синтаксическая ошибка, с косой чертой, указывающей на приблизительное местоположение ошибки.
Начиная с Python 3.10, вместо передачи value и tb в качестве первого аргумента можно передать объект исключения. Если переданы value и tb, первый аргумент игнорируется для обеспечения обратной совместимости.
Необязательный аргумент limit имеет то же значение, что и для
print_tb()
. Если chain равен true (по умолчанию), то цепочки исключений (атрибуты исключения__cause__
или__context__
) также будут выведены на печать, как это делает сам интерпретатор при печати необработанного исключения.Изменено в версии 3.5: Аргумент etype игнорируется и выводится из типа значения.
Изменено в версии 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)¶ Выведите до лимита записей трассировки стека (начиная с точки вызова), если лимит положителен. В противном случае печатаются последние
abs(limit)
записи. Если limit опущен илиNone
, печатаются все записи. Необязательный аргумент f может быть использован для указания альтернативного фрейма стека для запуска. Необязательный аргумент file имеет то же значение, что и дляprint_tb()
.Изменено в версии 3.5: Добавлена поддержка отрицательного лимита.
-
traceback.
extract_tb
(tb, limit=None)¶ Возвращает объект
StackSummary
, представляющий список «предварительно обработанных» записей трассировки стека, извлеченных из объекта трассировки 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, вместо передачи значения в качестве первого аргумента можно передавать объект исключения. Если передано значение, первый аргумент игнорируется для обеспечения обратной совместимости.
Изменено в версии 3.10: Параметр etype был переименован в exc и теперь является только позиционным.
-
traceback.
format_exception
(exc, /, [value, tb, ]limit=None, chain=True)¶ Форматирует трассировку стека и информацию об исключении. Аргументы имеют то же значение, что и соответствующие аргументы команды
print_exception()
. Возвращаемое значение представляет собой список строк, каждая из которых заканчивается новой строкой, а некоторые содержат внутренние новые строки. Когда эти строки конкатенируются и выводятся на печать, печатается точно такой же текст, как и вprint_exception()
.Изменено в версии 3.5: Аргумент etype игнорируется и выводится из типа значения.
Изменено в версии 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
Объекты¶
Добавлено в версии 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 равно true, то в атрибутах класса сохраняются только те данные, которые требуются методу
TracebackException
format
. В частности, поле__context__
вычисляется, только если__cause__
равноNone
и__suppress_context__
равно false.Обратите внимание, что когда локали перехватываются, они также отображаются в трассировке.
-
__cause__
¶ TracebackException
исходного__cause__
.
-
__context__
¶ TracebackException
исходного__context__
.
-
__suppress_context__
¶ Значение
__suppress_context__
из исходного исключения.
-
stack
¶ StackSummary
, представляющий обратную трассировку.
-
exc_type
¶ Класс исходного возврата трассировки.
-
filename
¶ Для синтаксических ошибок - имя файла, в котором произошла ошибка.
-
lineno
¶ Для синтаксических ошибок - номер строки, в которой произошла ошибка.
-
text
¶ Для синтаксических ошибок - текст, в котором произошла ошибка.
-
offset
¶ Для синтаксических ошибок - смещение в тексте, где произошла ошибка.
-
msg
¶ Для синтаксических ошибок - сообщение об ошибке компилятора.
-
classmethod
from_exception
(exc, *, limit=None, lookup_lines=True, capture_locals=False)¶ Захват исключения для последующей визуализации. limit, lookup_lines и capture_locals - как для класса
StackSummary
.Обратите внимание, что когда локали перехватываются, они также отображаются в трассировке.
-
format
(*, chain=True)¶ Отформатируйте исключение.
Если цепочка не
True
,__cause__
и__context__
не будут отформатированы.Возвращаемое значение - генератор строк, каждая из которых заканчивается новой строкой, а некоторые содержат внутренние новые строки.
print_exception()
является оберткой вокруг этого метода, которая просто печатает строки в файл.Сообщение о том, какое исключение произошло, всегда является последней строкой в выводе.
-
format_exception_only
()¶ Отформатируйте часть трассировки исключения.
Возвращаемое значение представляет собой генератор строк, каждая из которых заканчивается новой строкой.
Обычно генератор выдает одну строку, однако для исключений
SyntaxError
он выдает несколько строк, которые (при печати) отображают подробную информацию о том, где произошла синтаксическая ошибка.Сообщение о том, какое исключение произошло, всегда является последней строкой в выводе.
Изменено в версии 3.10: Добавлен параметр компактность.
-
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
()¶ Возвращает список строк, готовых к печати. Каждая строка в полученном списке соответствует одному кадру из стека. Каждая строка заканчивается новой строкой; строки могут содержать и внутренние новые строки, для тех элементов, которые имеют строки исходного текста.
Для длинных последовательностей одного и того же кадра и строки показываются первые несколько повторов, за которыми следует итоговая строка с указанием точного количества последующих повторов.
Изменено в версии 3.6: Длинные последовательности повторяющихся кадров теперь сокращаются.
-
classmethod
FrameSummary
Объекты¶
Добавлено в версии 3.5.
Объекты FrameSummary
представляют один кадр в трассировке.
-
class
traceback.
FrameSummary
(filename, lineno, name, lookup_line=True, locals=None, line=None)¶ Представляет один кадр в трассировке или стеке, который форматируется или печатается. По желанию в него может быть включена строковая версия локалей фреймов. Если lookup_line равен
False
, исходный код не просматривается до тех пор, покаFrameSummary
не получит доступ к атрибутуline
(что также происходит при приведении его к кортежу).line
может быть предоставлен напрямую, и в этом случае поиск строк вообще не будет выполняться. locals - необязательный словарь локальных переменных, и если он предоставлен, то представления переменных сохраняются в сводке для последующего отображения.
Примеры обратного прохода¶
Этот простой пример реализует базовый цикл read-eval-print, похожий (но менее полезный, чем) стандартный цикл интерактивного интерпретатора 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_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:")
# exc_type below is ignored on 3.5 and later
traceback.print_exception(exc_type, exc_value, exc_traceback,
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:")
# exc_type below is ignored on 3.5 and later
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:
[<FrameSummary file <doctest...>, line 10 in <module>>,
<FrameSummary file <doctest...>, line 4 in lumberjack>,
<FrameSummary file <doctest...>, line 7 in bright_side_of_death>]
*** 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']