Spec-Zone.ru › Python 3.10

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

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

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

Модуль использует объекты traceback — это тип объекта, хранящийся в переменной sys.last_traceback и возвращаемый в качестве третьего элемента из sys.exc_info().

См. также

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 истинно (по умолчанию), то выводились исключения, связанные с цепочкой (__cause__ или __context__ атрибуты исключения), так же как интерпретатор делает это при выводе необработанного исключения.

Изменено в версии 3.5: Аргумент etype игнорируется и выводится по типу value.

Изменено в версии 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)

Выводит до 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(exc, /[, value])

Форматирует часть исключения в стеке отладки, используя значение исключения, такое как предоставленное sys.last_value. Возвращаемое значение — это список строк, каждая из которых заканчивается переводом строки. Обычно список содержит одну строку; однако для исключений SyntaxError он содержит несколько строк, которые (при выводе) отображают подробную информацию о том, где произошла синтаксическая ошибка. Сообщение, указывающее на то, какое исключение произошло, всегда является последней строкой в списке.

С Python 3.10 вместо передачи value можно передать объект исключения в качестве первого аргумента. Если value предоставлен, первый аргумент игнорируется для обеспечения обратной совместимости.

Изменено в версии 3.10: Параметр etype переименован в exc и теперь является только позиционным.

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)

Очищает локальные переменные всех кадров стека в стеке отладки tb, вызывая метод clear() каждого объекта кадра.

Новое в версии 3.4.

traceback.walk_stack(f)

Перемещается по стеку, следуя за f.f_back от заданного кадра, возвращая кадр и номер строки для каждого кадра. Если f — None, используется текущий стек. Эта вспомогательная функция используется с StackSummary.extract().

Новое в версии 3.5.

END_OF_DOCUMENT_MARKER
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’s format. В частности, поле __context__ вычисляется только если __cause__ имеет значение None и __suppress_context__ имеет значение false.

Обратите внимание, что при захвате локальных переменных они также отображаются в стеке отладки.

__cause__

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

__context__

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

__suppress_context__

Значение __suppress_context__ из исходного исключения.

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.

Обратите внимание, что при захвате локальных переменных они также отображаются в стеке отладки.

format(*, chain=True)

Форматирование исключения.

Если chain не True, __cause__ и __context__ не будут отформатированы.

Возвращаемое значение — генератор строк, каждая из которых заканчивается новой строкой, а некоторые содержат внутренние новые строки. print_exception() — обёртка над этим методом, которая просто выводит строки в файл.

Сообщение, указывающее, какое исключение произошло, всегда является последней строкой в выводе.

format_exception_only()

Форматирование части исключения в стеке отладки.

Возвращаемое значение — генератор строк, каждая из которых заканчивается новой строкой.

Обычно генератор выводит одну строку; однако, для исключений SyntaxError он выводит несколько строк, которые (при выводе) отображают подробную информацию о том, где произошла синтаксическая ошибка.

Сообщение, указывающее, какое исключение произошло, всегда является последней строкой в выводе.

Изменено в версии 3.10: Добавлен параметр compact.

Объекты 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: Длинные последовательности повторяющихся кадров теперь сокращаются.

Объекты 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_life()

def bright_side_of_life():
    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:")
    traceback.print_exception(exc_value, 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_value)))
    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...>", line 10, in <module>\n    lumberjack()\n',
 '  File "<doctest...>", line 4, in lumberjack\n    bright_side_of_life()\n',
 '  File "<doctest...>", line 7, in bright_side_of_life\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_life>]
*** format_tb:
['  File "<doctest...>", line 10, in <module>\n    lumberjack()\n',
 '  File "<doctest...>", line 4, in lumberjack\n    bright_side_of_life()\n',
 '  File "<doctest...>", line 7, in bright_side_of_life\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–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/library/traceback.html

Spec-Zone.ru

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