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

traceback.md

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

1> **Источник:** https://python-all.ru/3.1/library/traceback.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 27.8. `traceback` – Вывод или получение трассировки стека89Этот модуль предоставляет стандартный интерфейс для извлечения, форматирования и печати трассировок стека программ Python. Он в точности повторяет поведение интерпретатора Python при печати трассировки стека. Это полезно, когда требуется печатать трассировки стека программно, например, в «обёртке» вокруг интерпретатора.1011Модуль использует объекты трассировки – это тип объектов, который хранится в переменной [`sys.last_traceback`](https://python-all.ru/3.1/library/sys.html#sys.last_traceback) и возвращается третьим элементом из [`sys.exc_info()`](https://python-all.ru/3.1/library/sys.html#sys.exc_info).1213Модуль определяет следующие функции:1415#### `traceback.print_tb(traceback, limit=None, file=None)`1617Выводит до1819*limit*2021записей стековой трассировки из2223*traceback*2425. Если2627*limit*2829опущен или равен3031`None`3233, выводятся все записи. Если3435*file*3637опущен или равен3839`None`4041, вывод направляется в4243`sys.stderr`4445; в противном случае это должен быть открытый файл или объект, подобный файлу, для получения вывода.4647#### `traceback.print_exception(type, value, traceback, limit=None, file=None, chain=True)`4849Выводит информацию об исключении и до *limit* записей стековой трассировки из *traceback* в *file*. Отличается от [`print_tb()`](https://python-all.ru/3.1/library/traceback.html#traceback.print_tb) следующим:5051- если *traceback* не равен `None`, выводится заголовок `Traceback (most recent call last):`52- выводит тип исключения *type* и *value* после стековой трассировки53- если *type* – [`SyntaxError`](https://python-all.ru/3.1/library/exceptions.html#SyntaxError), а *value* имеет соответствующий формат, то выводится строка с синтаксической ошибкой и символом «^», указывающим примерное положение ошибки.5455If *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.5657#### `traceback.print_exc(limit=None, file=None, chain=True)`5859Это сокращение для6061`print_exception(*sys.exc_info())`6263.6465#### `traceback.print_last(limit=None, file=None, chain=True)`6667Это сокращение для6869`print_exception(sys.last_type, sys.last_value, sys.last_traceback, limit, file)`7071. Обычно работает только после того, как исключение достигло интерактивного приглашения (см.7273[`sys.last_type`](https://python-all.ru/3.1/library/sys.html#sys.last_type)7475).7677#### `traceback.print_stack(f=None, limit=None, file=None)`7879Эта функция выводит стековую трассировку начиная с точки вызова. Необязательный аргумент8081*f*8283позволяет указать альтернативный стековый кадр для начала. Необязательные аргументы8485*limit*8687и8889*file*9091имеют тот же смысл, что и для9293[`print_exception()`](https://python-all.ru/3.1/library/traceback.html#traceback.print_exception)9495.9697#### `traceback.extract_tb(traceback, limit=None)`9899Возвращает список не более100101*limit*102103«предварительно обработанных» записей трассировки стека, извлеченных из объекта трассировки104105*traceback*106107. Полезно для альтернативного форматирования трассировок стека. Если108109*limit*110111опущен или112113`None`114115, извлекаются все записи. «Предварительно обработанная» запись трассировки стека – это четверка (116117*filename*118119,120121*номер строки*122123,124125*имя функции*126127,128129*text*130131), представляющая информацию, которая обычно выводится для трассировки стека.132133*text*134135– это строка с удаленными начальными и конечными пробелами; если исходный код недоступен, значением будет136137`None`138139.140141#### `traceback.extract_stack(f=None, limit=None)`142143Извлекает «сырую» трассировку из текущего стекового кадра. Возвращаемое значение имеет тот же формат, что и для144145[`extract_tb()`](https://python-all.ru/3.1/library/traceback.html#traceback.extract_tb)146147. Необязательные аргументы148149*f*150151и152153*limit*154155имеют тот же смысл, что и для156157[`print_stack()`](https://python-all.ru/3.1/library/traceback.html#traceback.print_stack)158159.160161#### `traceback.format_list(list)`162163По списку кортежей, возвращённому164165[`extract_tb()`](https://python-all.ru/3.1/library/traceback.html#traceback.extract_tb)166167или168169[`extract_stack()`](https://python-all.ru/3.1/library/traceback.html#traceback.extract_stack)170171, возвращает список строк, готовых к печати. Каждая строка в результирующем списке соответствует элементу с тем же индексом в исходном списке. Каждая строка заканчивается символом новой строки; строки могут также содержать внутренние символы новой строки для тех элементов, у которых текст исходной строки не равен172173`None`174175.176177#### `traceback.format_exception_only(type, value)`178179Форматирует часть трассировки, относящуюся к исключению. Аргументы – это tип исключения и его значение, например, из180181`sys.last_type`182183и184185`sys.last_value`186187. Возвращаемое значение – список строк, каждая заканчивается символом новой строки. Обычно список содержит одну строку; однако для исключений188189[`SyntaxError`](https://python-all.ru/3.1/library/exceptions.html#SyntaxError)190191он содержит несколько строк, которые (при печати) отображают подробную информацию о том, где произошла синтаксическая ошибка. Сообщение, указывающее, какое именно исключение произошло, всегда является последней строкой в списке.192193#### `traceback.format_exception(type, value, tb, limit=None, chain=True)`194195Форматирует стековую трассировку и информацию об исключении. Аргументы имеют тот же смысл, что и соответствующие аргументы196197[`print_exception()`](https://python-all.ru/3.1/library/traceback.html#traceback.print_exception)198199. Возвращаемое значение – список строк, каждая заканчивается символом новой строки, некоторые содержат внутренние символы новой строки. Если эти строки объединить и вывести на печать, будет напечатан в точности тот же текст, что и при вызове200201[`print_exception()`](https://python-all.ru/3.1/library/traceback.html#traceback.print_exception)202203.204205#### `traceback.format_exc(limit=None, chain=True)`206207То же, что208209`print_exc(limit)`210211, но возвращает строку, а не выводит в файл.212213#### `traceback.format_tb(tb, limit=None)`214215Сокращение для216217`format_list(extract_tb(tb, limit))`218219.220221#### `traceback.format_stack(f=None, limit=None)`222223Сокращённая запись для224225`format_list(extract_stack(f, limit))`226227.228229## 27.8.1. Примеры трассировки230231Этот простой пример реализует базовый цикл read-eval-print, похожий на стандартный интерактивный цикл интерпретатора Python (но менее полезный). Для более полной реализации цикла интерпретатора обратитесь к модулю [`code`](https://python-all.ru/3.1/library/code.html#module-code).232233```python234import sys, traceback235236def run_user_code(envdir):237    source = input(">>> ")238    try:239        exec(source, envdir)240    except:241        print("Exception in user code:")242        print("-"*60)243        traceback.print_exc(file=sys.stdout)244        print("-"*60)245246envdir = {}247while True:248    run_user_code(envdir)249```250251Следующий пример демонстрирует различные способы вывода и форматирования исключения и трассировки:252253```python254import sys, traceback255256def lumberjack():257    bright_side_of_death()258259def bright_side_of_death():260    return tuple()[0]261262try:263    lumberjack()264except IndexError:265    exc_type, exc_value, exc_traceback = sys.exc_info()266    print("*** print_tb:")267    traceback.print_tb(exc_traceback, limit=1, file=sys.stdout)268    print("*** print_exception:")269    traceback.print_exception(exc_type, exc_value, exc_traceback,270                              limit=2, file=sys.stdout)271    print("*** print_exc:")272    traceback.print_exc()273    print("*** format_exc, first and last line:")274    formatted_lines = traceback.format_exc().splitlines()275    print(formatted_lines[0])276    print(formatted_lines[-1])277    print("*** format_exception:")278    print(repr(traceback.format_exception(exc_type, exc_value,279                                          exc_traceback)))280    print("*** extract_tb:")281    print(repr(traceback.extract_tb(exc_traceback)))282    print("*** format_tb:")283    print(repr(traceback.format_tb(exc_traceback)))284    print("*** tb_lineno:", exc_traceback.tb_lineno)285```286287Вывод для примера будет выглядеть примерно так:288289```text290*** print_tb:291  File "<doctest...>", line 10, in <module>292    lumberjack()293*** print_exception:294Traceback (most recent call last):295  File "<doctest...>", line 10, in <module>296    lumberjack()297  File "<doctest...>", line 4, in lumberjack298    bright_side_of_death()299IndexError: tuple index out of range300*** print_exc:301Traceback (most recent call last):302  File "<doctest...>", line 10, in <module>303    lumberjack()304  File "<doctest...>", line 4, in lumberjack305    bright_side_of_death()306IndexError: tuple index out of range307*** format_exc, first and last line:308Traceback (most recent call last):309IndexError: tuple index out of range310*** format_exception:311['Traceback (most recent call last):\n',312 '  File "<doctest...>", line 10, in <module>\n    lumberjack()\n',313 '  File "<doctest...>", line 4, in lumberjack\n    bright_side_of_death()\n',314 '  File "<doctest...>", line 7, in bright_side_of_death\n    return tuple()[0]\n',315 'IndexError: tuple index out of range\n']316*** extract_tb:317[('<doctest...>', 10, '<module>', 'lumberjack()'),318 ('<doctest...>', 4, 'lumberjack', 'bright_side_of_death()'),319 ('<doctest...>', 7, 'bright_side_of_death', 'return tuple()[0]')]320*** format_tb:321['  File "<doctest...>", line 10, in <module>\n    lumberjack()\n',322 '  File "<doctest...>", line 4, in lumberjack\n    bright_side_of_death()\n',323 '  File "<doctest...>", line 7, in bright_side_of_death\n    return tuple()[0]\n']324*** tb_lineno: 10325```326327Следующий пример показывает различные способы вывода и форматирования стека:328329```python330>>> import traceback331>>> def another_function():332...     lumberstack()333...334>>> def lumberstack():335...     traceback.print_stack()336...     print(repr(traceback.extract_stack()))337...     print(repr(traceback.format_stack()))338...339>>> another_function()340  File "<doctest>", line 10, in <module>341    another_function()342  File "<doctest>", line 3, in another_function343    lumberstack()344  File "<doctest>", line 6, in lumberstack345    traceback.print_stack()346[('<doctest>', 10, '<module>', 'another_function()'),347 ('<doctest>', 3, 'another_function', 'lumberstack()'),348 ('<doctest>', 7, 'lumberstack', 'print(repr(traceback.extract_stack()))')]349['  File "<doctest>", line 10, in <module>\n    another_function()\n',350 '  File "<doctest>", line 3, in another_function\n    lumberstack()\n',351 '  File "<doctest>", line 8, in lumberstack\n    print(repr(traceback.format_stack()))\n']352```353354Этот последний пример демонстрирует несколько последних функций форматирования:355356```python357>>> import traceback358>>> traceback.format_list([('spam.py', 3, '<module>', 'spam.eggs()'),359...                        ('eggs.py', 42, 'eggs', 'return "bacon"')])360['  File "spam.py", line 3, in <module>\n    spam.eggs()\n',361 '  File "eggs.py", line 42, in eggs\n    return "bacon"\n']362>>> an_error = IndexError('tuple index out of range')363>>> traceback.format_exception_only(type(an_error), an_error)364['IndexError: tuple index out of range\n']365```366