traceback — Вывод или получение стека исключений
Исходный код: Lib/traceback.py
Этот модуль предоставляет стандартный интерфейс для извлечения, форматирования и вывода стека исключений программ Python. Он точно имитирует поведение интерпретатора Python при выводе стека исключений. Это полезно, когда вы хотите выводить стеки исключений под управлением программы, например, в «обёртке» вокруг интерпретатора.
Модуль использует объекты traceback — это объекты типа types.TracebackType, которые назначаются полю __traceback__ экземпляров BaseException.
См. также
-
Modulefaulthandler -
Используется для явного вывода стеков исключений Python при ошибках, по истечении времени ожидания или при сигнале пользователя.
-
Modulepdb -
Интерактивный отладчик исходного кода для программ 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 равно true (по умолчанию), будут выведены цепочки исключений (атрибуты__cause__или__context__исключения), как это делает сам интерпретатор при выводе необработанного исключения.Изменено в версии 3.5: Аргумент etype игнорируется и определяется по типу value.
Изменено в версии 3.10: Параметр etype переименован в exc и теперь является только позиционным.
- если tb не
-
traceback.print_exc(limit=None, file=None, chain=True) -
Это сокращение для
print_exception(sys.exception(), limit, file, chain).
-
traceback.print_last(limit=None, file=None, chain=True) -
Это сокращение для
print_exception(sys.last_exc, limit, file, chain). Как правило, оно будет работать только после того, как исключение достигло интерактивного приглашения (см.sys.last_exc).
-
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, представляющие информацию, обычно выводимую для стека исключений.
-
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, он содержит несколько строк, которые (при выводе) отображают подробную информацию о месте возникновения синтаксической ошибки. После сообщения список содержитnotesисключения.С Python 3.10, вместо передачи value, можно передать объект исключения в качестве первого аргумента. Если value предоставлен, первый аргумент игнорируется для обеспечения обратной совместимости.
Изменено в версии 3.10: Параметр etype переименован в exc и теперь является только позиционным.
Изменено в версии 3.11: Возвращаемый список теперь включает любые
notesсвязанные с исключением.
-
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) -
Очищает локальные переменные всех фреймов стека в объекте traceback tb, вызывая метод
clear()каждого объекта фрейма объекта фрейма.Добавлен в версии 3.4.
-
traceback.walk_stack(f) -
Проходит по стеку вызовов, следуя по ссылке
f.f_backот заданного фрейма, возвращая фрейм и номер строки для каждого фрейма. Если fNone, используется текущий стек. Этот вспомогательный метод используется с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, max_group_width=15, max_group_depth=10) -
Захватывает исключение для последующего отображения. limit, lookup_lines и capture_locals — такие же, как для класса
StackSummary.Если compact имеет значение true, то в атрибутах класса сохраняются только данные, необходимые методу
TracebackException’sformat(). В частности, поле__context__вычисляется только если__cause__имеет значениеNoneи__suppress_context__равно false.Обратите внимание, что при захвате локальных переменных они также отображаются в трассировке.
max_group_width и max_group_depth управляют форматированием групп исключений (см.
BaseExceptionGroup). Глубина относится к уровню вложенности группы, а ширина — к размеру массива исключений одной группы. Отформатированный вывод усекается, когда превышен любой из лимитов.Изменено в версии 3.10: Добавлен параметр compact.
Изменено в версии 3.11: Добавлены параметры max_group_width и max_group_depth.
-
__cause__ -
Ссылка на исходное
__cause__.
-
__context__ -
Ссылка на исходное
__context__.
-
exceptions -
Если
selfпредставляет собойExceptionGroup, это поле содержит список экземпляровTracebackException, представляющих вложенные исключения. В противном случае оно имеет значениеNone.Добавлен в версии 3.11.
-
__suppress_context__ -
Значение
__suppress_context__из исходного исключения.
-
__notes__ -
Значение
__notes__из исходного исключения илиNoneесли у исключения нет заметок. Если неNone, оно форматируется в трассировке после строки исключения.Добавлен в версии 3.11.
-
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.Обратите внимание, что при захвате локальных переменных они также отображаются в трассировке.
-
print(*, file=None, chain=True) -
Выводит информацию об исключении, возвращаемую
format(), в file (по умолчаниюsys.stderr).Добавлен в версии 3.11.
-
format(*, chain=True) -
Форматирует исключение.
Если chain не
True,__cause__и__context__не будут отформатированы.Возвращаемое значение — генератор строк, каждая заканчивается новой строкой, а некоторые содержат внутренние новые строки.
print_exception()— это обёртка над этим методом, которая просто печатает строки в файл.
-
format_exception_only() -
Форматирует часть исключения в трассировке.
Возвращаемое значение — генератор строк, каждая заканчивается новой строкой.
Генератор выводит сообщение исключения, за которым следуют его заметки (если они есть). Сообщение об исключении обычно является одной строкой; однако для исключений
SyntaxErrorоно состоит из нескольких строк, которые (при печати) отображают подробную информацию о том, где произошла синтаксическая ошибка.Изменено в версии 3.11: Теперь заметки
notesисключения включены в вывод.
-
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_localsTrue, локальные переменные в каждомFrameSummaryзахватываются как представления объектов.Изменено в версии 3.12: Исключения, возбуждённые из
repr()по локальной переменной (когда capture_localsTrue), больше не распространяются на вызывающую сторону.
-
classmethod from_list(a_list) -
Создаёт объект
StackSummaryиз списка объектовFrameSummaryили списка кортежей старого стиля. Каждый кортеж должен быть 4-кортежем с filename, lineno, name, line в качестве элементов.
-
format() -
Возвращает список строк, готовых для вывода. Каждая строка в результирующем списке соответствует одному кадру из стека. Каждая строка заканчивается новой строкой; строки могут содержать и внутренние новые строки для элементов со строками исходного текста.
Для длинных последовательностей одинакового кадра и строки отображаются первые несколько повторений, за которыми следует строка сводки, указывающая точное количество дополнительных повторений.
Изменено в версии 3.6: Длинные последовательности повторяющихся кадров теперь сокращаются.
-
format_frame_summary(frame_summary) -
Возвращает строку для вывода одного из кадров, участвующих в стеке. Этот метод вызывается для каждого объекта
FrameSummary, который должен быть выведен методомStackSummary.format(). Если он возвращаетNone, кадр пропускается в выводе.Добавлен в версии 3.11.
-
FrameSummary Объекты
Добавлен в версии 3.5.
Объект FrameSummary представляет собой один кадр в стеке отслеживания ошибок.
-
class traceback.FrameSummary(filename, lineno, name, lookup_line=True, locals=None, line=None) -
Представляет собой один кадр в стеке отслеживания ошибок, который форматируется или выводится. Он может иметь строковое представление локальных переменных кадра, включённых в него. Если lookup_line
False, исходный код не ищется до тех пор, пока уFrameSummaryне будет обращён атрибутline(что также происходит при приведении его кtuple).lineможет быть задан непосредственно и предотвратит поиск строки вообще. locals — это необязательный словарь локальных переменных, и если он задан, представления переменных хранятся в сводке для последующего отображения.Для экземпляров
FrameSummaryимеются следующие атрибуты:-
filename -
Имя файла исходного кода для этого кадра. Эквивалентно обращению к
f.f_code.co_filenameобъекта объекта кадра f.
-
lineno -
Номер строки исходного кода для этого кадра.
-
name -
Эквивалентно обращению к
f.f_code.co_nameобъекта объекта кадра f.
-
line -
Строка, представляющая исходный код для этого кадра, с удалением начальных и конечных пробелов. Если исходный код недоступен, он
None.
-
Примеры стеков отслеживания ошибок
Этот простой пример реализует цикл «чтение-оценка-вывод», аналогичный (но менее полезный, чем) стандартному циклу интерпретатора 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 = sys.exception()
print("*** print_tb:")
traceback.print_tb(exc.__traceback__, limit=1, file=sys.stdout)
print("*** print_exception:")
traceback.print_exception(exc, 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)))
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 default[0]>", line 10, in <module>\n lumberjack()\n',
' File "<doctest default[0]>", line 4, in lumberjack\n bright_side_of_life()\n',
' File "<doctest default[0]>", line 7, in bright_side_of_life\n return tuple()[0]\n ~~~~~~~^^^\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 default[0]>", line 10, in <module>\n lumberjack()\n',
' File "<doctest default[0]>", line 4, in lumberjack\n bright_side_of_life()\n',
' File "<doctest default[0]>", line 7, in bright_side_of_life\n return tuple()[0]\n ~~~~~~~^^^\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']
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/traceback.html