Документация Python неофициальный перевод

traceback.md

216 строк · 14.7 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.4/library/traceback.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 29.9. [`traceback`](https://python-all.ru/3.4/library/traceback.html#module-traceback) – Вывод и получение стековой трассировки89Этот модуль предоставляет стандартный интерфейс для извлечения, форматирования и печати трассировок стека программ Python. Он в точности повторяет поведение интерпретатора Python при печати трассировки стека. Это полезно, когда требуется печатать трассировки стека программно, например, в «обёртке» вокруг интерпретатора.1011Модуль использует объекты трассировки – это тип объектов, который хранится в переменной [`sys.last_traceback`](https://python-all.ru/3.4/library/sys.html#sys.last_traceback) и возвращается третьим элементом из [`sys.exc_info()`](https://python-all.ru/3.4/library/sys.html#sys.exc_info).1213Модуль определяет следующие функции:1415#### `traceback.print_tb(traceback, limit=None, file=None)`1617Выводит до *limit* записей стековой трассировки из *traceback*. Если *limit* опущен или равен `None`, выводятся все записи. Если *file* опущен или равен `None`, вывод направляется в `sys.stderr`; в противном случае это должен быть открытый файл или объект, подобный файлу, для получения вывода.1819#### `traceback.print_exception(type, value, traceback, limit=None, file=None, chain=True)`2021Выводит информацию об исключении и до *limit* записей стековой трассировки из *traceback* в *file*. Отличается от [`print_tb()`](https://python-all.ru/3.4/library/traceback.html#traceback.print_tb) следующим:2223- если *traceback* не равен `None`, выводится заголовок `Traceback (most recent call last):`24- выводит тип исключения *type* и *value* после стековой трассировки25- если *type* – [`SyntaxError`](https://python-all.ru/3.4/library/exceptions.html#SyntaxError), а *value* имеет соответствующий формат, то выводится строка с синтаксической ошибкой и символом «^», указывающим примерное положение ошибки.2627If *chain* is true (the default), then chained exceptions (the `__cause__` or `__context__` attributes of the exception) will be printed as well, like the interpreter itself does when printing an unhandled exception.2829#### `traceback.print_exc(limit=None, file=None, chain=True)`3031Это сокращение для `print_exception(*sys.exc_info())`.3233#### `traceback.print_last(limit=None, file=None, chain=True)`3435Это сокращение для `print_exception(sys.last_type, sys.last_value, sys.last_traceback, limit, file)`. Обычно работает только после того, как исключение достигло интерактивного приглашения (см. [`sys.last_type`](https://python-all.ru/3.4/library/sys.html#sys.last_type)).3637#### `traceback.print_stack(f=None, limit=None, file=None)`3839Эта функция выводит стековую трассировку начиная с точки вызова. Необязательный аргумент *f* позволяет указать альтернативный стековый кадр для начала. Необязательные аргументы *limit* и *file* имеют тот же смысл, что и для [`print_exception()`](https://python-all.ru/3.4/library/traceback.html#traceback.print_exception).4041#### `traceback.extract_tb(traceback, limit=None)`4243Возвращает список до *limit* «предварительно обработанных» записей стековой трассировки, извлечённых из объекта трассировки *traceback*. Полезен для альтернативного форматирования стековых трассировок. Если *limit* опущен или равен `None`, извлекаются все записи. «Предварительно обработанная» запись трассировки – это кортеж из 4 элементов (*filename*, *номер строки*, *имя функции*, *text*), представляющий информацию, обычно выводимую для стековой трассировки. *text* – строка с удалёнными начальными и конечными пробелами; если исходный код недоступен, значением будет `None`.4445#### `traceback.extract_stack(f=None, limit=None)`4647Извлекает «сырую» трассировку из текущего стекового кадра. Возвращаемое значение имеет тот же формат, что и для [`extract_tb()`](https://python-all.ru/3.4/library/traceback.html#traceback.extract_tb). Необязательные аргументы *f* и *limit* имеют тот же смысл, что и для [`print_stack()`](https://python-all.ru/3.4/library/traceback.html#traceback.print_stack).4849#### `traceback.format_list(list)`5051По списку кортежей, возвращённому [`extract_tb()`](https://python-all.ru/3.4/library/traceback.html#traceback.extract_tb) или [`extract_stack()`](https://python-all.ru/3.4/library/traceback.html#traceback.extract_stack), возвращает список строк, готовых к печати. Каждая строка в результирующем списке соответствует элементу с тем же индексом в исходном списке. Каждая строка заканчивается символом новой строки; строки могут также содержать внутренние символы новой строки для тех элементов, у которых текст исходной строки не равен `None`.5253#### `traceback.format_exception_only(type, value)`5455Форматирует часть трассировки, относящуюся к исключению. Аргументы – это tип исключения и его значение, например, из `sys.last_type` и `sys.last_value`. Возвращаемое значение – список строк, каждая заканчивается символом новой строки. Обычно список содержит одну строку; однако для исключений [`SyntaxError`](https://python-all.ru/3.4/library/exceptions.html#SyntaxError) он содержит несколько строк, которые (при печати) отображают подробную информацию о том, где произошла синтаксическая ошибка. Сообщение, указывающее, какое именно исключение произошло, всегда является последней строкой в списке.5657#### `traceback.format_exception(type, value, tb, limit=None, chain=True)`5859Форматирует стековую трассировку и информацию об исключении. Аргументы имеют тот же смысл, что и соответствующие аргументы [`print_exception()`](https://python-all.ru/3.4/library/traceback.html#traceback.print_exception). Возвращаемое значение – список строк, каждая заканчивается символом новой строки, некоторые содержат внутренние символы новой строки. Если эти строки объединить и вывести на печать, будет напечатан в точности тот же текст, что и при вызове [`print_exception()`](https://python-all.ru/3.4/library/traceback.html#traceback.print_exception).6061#### `traceback.format_exc(limit=None, chain=True)`6263То же, что `print_exc(limit)`, но возвращает строку, а не выводит в файл.6465#### `traceback.format_tb(tb, limit=None)`6667Сокращение для `format_list(extract_tb(tb, limit))`.6869#### `traceback.format_stack(f=None, limit=None)`7071Сокращённая запись для `format_list(extract_stack(f, limit))`.7273#### `traceback.clear_frames(tb)`7475Очищает локальные переменные всех стековых фреймов в traceback *tb* путём вызова метода `clear()` каждого объекта фрейма.7677Новое в версии 3.4.7879## 29.9.1. Примеры traceback8081Этот простой пример реализует базовый цикл read-eval-print, похожий на стандартный интерактивный цикл интерпретатора Python (но менее полезный). Для более полной реализации цикла интерпретатора обратитесь к модулю [`code`](https://python-all.ru/3.4/library/code.html#module-code).8283```python84import sys, traceback8586def run_user_code(envdir):87    source = input(">>> ")88    try:89        exec(source, envdir)90    except Exception:91        print("Exception in user code:")92        print("-"*60)93        traceback.print_exc(file=sys.stdout)94        print("-"*60)9596envdir = {}97while True:98    run_user_code(envdir)99```100101Следующий пример демонстрирует различные способы вывода и форматирования исключения и трассировки:102103```python104import sys, traceback105106def lumberjack():107    bright_side_of_death()108109def bright_side_of_death():110    return tuple()[0]111112try:113    lumberjack()114except IndexError:115    exc_type, exc_value, exc_traceback = sys.exc_info()116    print("*** print_tb:")117    traceback.print_tb(exc_traceback, limit=1, file=sys.stdout)118    print("*** print_exception:")119    traceback.print_exception(exc_type, exc_value, exc_traceback,120                              limit=2, file=sys.stdout)121    print("*** print_exc:")122    traceback.print_exc()123    print("*** format_exc, first and last line:")124    formatted_lines = traceback.format_exc().splitlines()125    print(formatted_lines[0])126    print(formatted_lines[-1])127    print("*** format_exception:")128    print(repr(traceback.format_exception(exc_type, exc_value,129                                          exc_traceback)))130    print("*** extract_tb:")131    print(repr(traceback.extract_tb(exc_traceback)))132    print("*** format_tb:")133    print(repr(traceback.format_tb(exc_traceback)))134    print("*** tb_lineno:", exc_traceback.tb_lineno)135```136137Вывод для примера будет выглядеть примерно так:138139```text140*** print_tb:141  File "<doctest...>", line 10, in <module>142    lumberjack()143*** print_exception:144Traceback (most recent call last):145  File "<doctest...>", line 10, in <module>146    lumberjack()147  File "<doctest...>", line 4, in lumberjack148    bright_side_of_death()149IndexError: tuple index out of range150*** print_exc:151Traceback (most recent call last):152  File "<doctest...>", line 10, in <module>153    lumberjack()154  File "<doctest...>", line 4, in lumberjack155    bright_side_of_death()156IndexError: tuple index out of range157*** format_exc, first and last line:158Traceback (most recent call last):159IndexError: tuple index out of range160*** format_exception:161['Traceback (most recent call last):\n',162 '  File "<doctest...>", line 10, in <module>\n    lumberjack()\n',163 '  File "<doctest...>", line 4, in lumberjack\n    bright_side_of_death()\n',164 '  File "<doctest...>", line 7, in bright_side_of_death\n    return tuple()[0]\n',165 'IndexError: tuple index out of range\n']166*** extract_tb:167[('<doctest...>', 10, '<module>', 'lumberjack()'),168 ('<doctest...>', 4, 'lumberjack', 'bright_side_of_death()'),169 ('<doctest...>', 7, 'bright_side_of_death', 'return tuple()[0]')]170*** format_tb:171['  File "<doctest...>", line 10, in <module>\n    lumberjack()\n',172 '  File "<doctest...>", line 4, in lumberjack\n    bright_side_of_death()\n',173 '  File "<doctest...>", line 7, in bright_side_of_death\n    return tuple()[0]\n']174*** tb_lineno: 10175```176177Следующий пример показывает различные способы вывода и форматирования стека:178179```python180>>> import traceback181>>> def another_function():182...     lumberstack()183...184>>> def lumberstack():185...     traceback.print_stack()186...     print(repr(traceback.extract_stack()))187...     print(repr(traceback.format_stack()))188...189>>> another_function()190  File "<doctest>", line 10, in <module>191    another_function()192  File "<doctest>", line 3, in another_function193    lumberstack()194  File "<doctest>", line 6, in lumberstack195    traceback.print_stack()196[('<doctest>', 10, '<module>', 'another_function()'),197 ('<doctest>', 3, 'another_function', 'lumberstack()'),198 ('<doctest>', 7, 'lumberstack', 'print(repr(traceback.extract_stack()))')]199['  File "<doctest>", line 10, in <module>\n    another_function()\n',200 '  File "<doctest>", line 3, in another_function\n    lumberstack()\n',201 '  File "<doctest>", line 8, in lumberstack\n    print(repr(traceback.format_stack()))\n']202```203204Этот последний пример демонстрирует несколько последних функций форматирования:205206```python207>>> import traceback208>>> traceback.format_list([('spam.py', 3, '<module>', 'spam.eggs()'),209...                        ('eggs.py', 42, 'eggs', 'return "bacon"')])210['  File "spam.py", line 3, in <module>\n    spam.eggs()\n',211 '  File "eggs.py", line 42, in eggs\n    return "bacon"\n']212>>> an_error = IndexError('tuple index out of range')213>>> traceback.format_exception_only(type(an_error), an_error)214['IndexError: tuple index out of range\n']215```216