traceback.md
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