traceback — Вывод или получение трассировки стека
Исходный код: Lib/traceback.py
Этот модуль предоставляет стандартный интерфейс для извлечения, форматирования и вывода трассировок стека программ Python. Он точно имитирует поведение интерпретатора Python при выводе трассировки стека. Это полезно, когда требуется выводить трассировки стека под управлением программы, например, в «обёртке» вокруг интерпретатора.
Модуль использует объекты traceback — это тип объекта, который хранится в переменной sys.last_traceback и возвращается в качестве третьего элемента из sys.exc_info().
Модуль определяет следующие функции:
-
traceback.print_tb(tb, limit=None, file=None) -
Вывести до limit элементов трассировки стека из объекта tb (начиная с кадра вызывающей функции), если limit положительно. В противном случае вывести последние
abs(limit)элементы. Если limit опущен илиNone, выводятся все элементы. Если file опущен илиNone, вывод происходит вsys.stderr; в противном случае это должен быть открытый файл или файлоподобный объект, принимающий вывод.Изменено в версии 3.5: Добавлена поддержка отрицательного значения limit.
-
traceback.print_exception(etype, value, tb, limit=None, file=None, chain=True) -
Вывести информацию об исключении и элементы трассировки стека из объекта tb в file. Это отличается от
print_tb()следующим образом:- если tb не
None, выводится заголовокTraceback (most recent call last): - выводятся тип исключения etype и значение value после трассировки стека
- если type(value) является
SyntaxErrorи value имеет соответствующий формат, выводится строка с ошибкой синтаксиса с символом «^» для указания приблизительного положения ошибки.
Необязательный аргумент limit имеет то же значение, что и для
print_tb(). Если chain равно True (по умолчанию), то будут выведены и связанные исключения (атрибуты__cause__или__context__исключения), как это делает интерпретатор при выводе необработанного исключения.Изменено в версии 3.5: Аргумент etype игнорируется и определяется по типу value.
- если tb не
-
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) -
Вывести до limit элементов трассировки стека (начиная с точки вызова), если limit положительно. В противном случае вывести последние
abs(limit)элементы. Если limit опущен илиNone, выводятся все элементы. Необязательный аргумент f может быть использован для указания альтернативной точки начала стека. Необязательный аргумент file имеет то же значение, что и дляprint_tb().Изменено в версии 3.5: Добавлена поддержка отрицательного значения limit.
-
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(etype, value) -
Форматирует часть исключения в трассировке стека. Аргументы — это тип исключения и значение, такие как возвращаемые
sys.last_typeиsys.last_value. Возвращаемое значение — список строк, каждая из которых заканчивается новой строкой. Обычно список содержит одну строку; однако для исключенийSyntaxErrorон содержит несколько строк, которые (при выводе) отображают подробную информацию о том, где произошла ошибка синтаксиса. Сообщение, указывающее на то, какое исключение произошло, всегда является последней строкой в списке.
-
traceback.format_exception(etype, value, tb, limit=None, chain=True) -
Форматирует трассировку стека и информацию об исключении. Аргументы имеют то же значение, что и соответствующие аргументы функции
print_exception(). Возвращаемое значение — список строк, каждая из которых заканчивается новой строкой, а некоторые содержат внутренние новые строки. При конкатенации и выводе этих строк выводится ровно тот же текст, что и при выводе функцииprint_exception().Изменено в версии 3.5: Аргумент etype игнорируется и определяется по типу value.
-
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
None, используется текущий стек. Этот вспомогательный метод используется сStackSummary.extract().Добавлена в версии 3.5.
-
traceback.walk_tb(tb) -
Пройти по трассировке стека, начиная с данного кадра, вызывая кадры и номера строк для каждого кадра. Этот вспомогательный метод используется с
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) -
Захват исключения для последующего отображения. limit, lookup_lines и capture_locals аналогичны классу
StackSummary.Обратите внимание, что при захвате локальных переменных они также отображаются в трассировке.
-
__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) -
Форматирование исключения.
Если chain не
True,__cause__и__context__не будут отформатированы.Возвращаемое значение — генератор строк, каждая из которых заканчивается новой строкой, а некоторые содержат внутренние новые строки.
print_exception()— это обёртка над этим методом, которая просто выводит строки в файл.Сообщение об возникшем исключении всегда является последней строкой в выводе.
-
format_exception_only() -
Форматирование части исключения в трассировке.
Возвращаемое значение — генератор строк, каждая из которых заканчивается новой строкой.
Обычно генератор выводит одну строку; однако для исключений
SyntaxErrorон выводит несколько строк, которые (при выводе) отображают подробную информацию о том, где произошла ошибка синтаксиса.Сообщение об возникшем исключении всегда является последней строкой в выводе.
-
Объекты 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-кортежем с именем файла, номером строки, именем и строкой в качестве элементов.
-
format() -
Возвращает список строк, готовых для вывода. Каждая строка в результирующем списке соответствует одному кадру из стека. Каждая строка заканчивается новой строкой; строки могут содержать также внутренние новые строки для элементов со строками исходного текста.
Для длинных последовательностей одного и того же кадра и строки показываются первые несколько повторений, за которыми следует строка сводки с указанием точного количества последующих повторений.
Изменено в версии 3.6: Длинные последовательности повторяющихся фреймов теперь сокращаются.
-
Объекты FrameSummary
Новая версия 3.5.
Объекты FrameSummary представляют собой отдельный кадр в трассировке.
-
class traceback.FrameSummary(filename, lineno, name, lookup_line=True, locals=None, line=None) -
Представляет собой отдельный кадр в трассировке или стеке, который форматируется или выводится. Он может необязательно содержать строковое представление локальных переменных фрейма. Если lookup_line —
False, исходный код не ищется до тех пор, пока не будет получен доступ к атрибутуFrameSummary(что также происходит при приведении к кортежу).lineможет быть предоставлен напрямую и предотвратит поиск строк. locals — необязательный словарь локальных переменных, и если он предоставлен, то представления переменных сохраняются в сводке для последующего отображения.
Примеры использования traceback
Этот простой пример реализует цикл 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']
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.7/library/traceback.html