Spec-Zone.ru › Python 3.12

traceback — Вывод или получение стека исключений

Исходный код: Lib/traceback.py

Этот модуль предоставляет стандартный интерфейс для извлечения, форматирования и вывода стека исключений программ Python. Он точно имитирует поведение интерпретатора Python при выводе стека исключений. Это полезно, когда вы хотите выводить стеки исключений под управлением программы, например, в «обёртке» вокруг интерпретатора.

Модуль использует объекты traceback — это объекты типа types.TracebackType, которые назначаются полю __traceback__ экземпляров BaseException.

См. также

Module faulthandler

Используется для явного вывода стеков исключений Python при ошибках, по истечении времени ожидания или при сигнале пользователя.

Module pdb

Интерактивный отладчик исходного кода для программ 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 и теперь является только позиционным.

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 связанные с исключением.

END_OF_DOCUMENT_MARKER
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 от заданного фрейма, возвращая фрейм и номер строки для каждого фрейма. Если 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, max_group_width=15, max_group_depth=10)

Захватывает исключение для последующего отображения. limit, lookup_lines и capture_locals — такие же, как для класса StackSummary.

Если compact имеет значение true, то в атрибутах класса сохраняются только данные, необходимые методу TracebackException’s format(). В частности, поле __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_locals True, локальные переменные в каждом FrameSummary захватываются как представления объектов.

Изменено в версии 3.12: Исключения, возбуждённые из repr() по локальной переменной (когда capture_locals True), больше не распространяются на вызывающую сторону.

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API