Spec-Zone.ru › Python 3.11

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

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

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

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

См. также

Module faulthandler

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

Module pdb

Интерактивный отладчик исходного кода для программ Python.

Модуль определяет следующие функции:

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(exc, /, [value, tb, ]limit=None, file=None, chain=True)

Выводит информацию об исключении и записи трассировки стека из объекта трассировки 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_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, представляющие информацию, обычно выводимую для трассировки стека.

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 от заданного кадра, возвращая кадр и номер строки для каждого кадра. Если f — None, используется текущий стек. Этот вспомогательный метод используется с StackSummary.extract().

Добавлен в версии 3.5.

traceback.walk_tb(tb)

Обходит traceback, следуя за 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 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__

TracebackException исходного __cause__.

__context__

TracebackException исходного __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 фиксируются в виде объектов.

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 не обращаются (что также происходит при приведении его к типу 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–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/traceback.html

Spec-Zone.ru

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