traceback.md
1> **Источник:** https://python-all.ru/3.0/library/traceback.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `traceback` – печать или извлечение трассировки стека89Этот модуль предоставляет стандартный интерфейс для извлечения, форматирования и печати трассировок стека программ Python. Он в точности повторяет поведение интерпретатора Python при печати трассировки стека. Это полезно, когда требуется печатать трассировки стека программно, например, в «обёртке» вокруг интерпретатора.1011Модуль использует объекты traceback – это тип объектов, который хранится в переменной `sys.last_traceback` и возвращается третьим элементом из [`sys.exc_info()`](https://python-all.ru/3.0/library/sys.html#sys.exc_info).1213Модуль определяет следующие функции:1415#### `[traceback.print_tb]traceback.print_tb(traceback[, limit[, file]])`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]traceback.print_exception(type, value, traceback[, limit[, file[, chain]]])`4849Выводит информацию об исключении и до *limit* записей стековой трассировки из *traceback* в *file*. Отличается от [`print_tb()`](https://python-all.ru/3.0/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.0/library/exceptions.html#exceptions.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]traceback.print_exc([limit[, file[, chain]]])`5859Это сокращение для6061`print_exception(*sys.exc_info())`6263.6465#### `[traceback.print_last]traceback.print_last([limit[, file[, chain]]])`6667Это краткая форма для6869`print_exception(sys.last_type, sys.last_value, sys.last_traceback, limit, file)`7071.7273#### `[traceback.print_stack]traceback.print_stack([f[, limit[, file]]])`7475Эта функция выводит стековую трассировку начиная с точки вызова. Необязательный аргумент7677*f*7879позволяет указать альтернативный стековый кадр для начала. Необязательные аргументы8081*limit*8283и8485*file*8687имеют тот же смысл, что и для8889[`print_exception()`](https://python-all.ru/3.0/library/traceback.html#traceback.print_exception)9091.9293#### `[traceback.extract_tb]traceback.extract_tb(traceback[, limit])`9495Возвращает список не более9697*limit*9899«предварительно обработанных» записей трассировки стека, извлеченных из объекта трассировки100101*traceback*102103. Полезно для альтернативного форматирования трассировок стека. Если104105*limit*106107опущен или108109`None`110111, извлекаются все записи. «Предварительно обработанная» запись трассировки стека – это четверка (112113*filename*114115,116117*номер строки*118119,120121*имя функции*122123,124125*text*126127), представляющая информацию, которая обычно выводится для трассировки стека.128129*text*130131– это строка с удаленными начальными и конечными пробелами; если исходный код недоступен, значением будет132133`None`134135.136137#### `[traceback.extract_stack]traceback.extract_stack([f[, limit]])`138139Извлекает «сырую» трассировку из текущего стекового кадра. Возвращаемое значение имеет тот же формат, что и для140141[`extract_tb()`](https://python-all.ru/3.0/library/traceback.html#traceback.extract_tb)142143. Необязательные аргументы144145*f*146147и148149*limit*150151имеют тот же смысл, что и для152153[`print_stack()`](https://python-all.ru/3.0/library/traceback.html#traceback.print_stack)154155.156157#### `[traceback.format_list]traceback.format_list(list)`158159По списку кортежей, возвращённому160161[`extract_tb()`](https://python-all.ru/3.0/library/traceback.html#traceback.extract_tb)162163или164165[`extract_stack()`](https://python-all.ru/3.0/library/traceback.html#traceback.extract_stack)166167, возвращает список строк, готовых к печати. Каждая строка в результирующем списке соответствует элементу с тем же индексом в исходном списке. Каждая строка заканчивается символом новой строки; строки могут также содержать внутренние символы новой строки для тех элементов, у которых текст исходной строки не равен168169`None`170171.172173#### `[traceback.format_exception_only]traceback.format_exception_only(type, value)`174175Форматирует часть трассировки, относящуюся к исключению. Аргументы – это tип исключения и его значение, например, из176177`sys.last_type`178179и180181`sys.last_value`182183. Возвращаемое значение – список строк, каждая заканчивается символом новой строки. Обычно список содержит одну строку; однако для исключений184185[`SyntaxError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.SyntaxError)186187он содержит несколько строк, которые (при печати) отображают подробную информацию о том, где произошла синтаксическая ошибка. Сообщение, указывающее, какое именно исключение произошло, всегда является последней строкой в списке.188189#### `[traceback.format_exception]traceback.format_exception(type, value, tb[, limit[, chain]])`190191Форматирует стековую трассировку и информацию об исключении. Аргументы имеют тот же смысл, что и соответствующие аргументы192193[`print_exception()`](https://python-all.ru/3.0/library/traceback.html#traceback.print_exception)194195. Возвращаемое значение – список строк, каждая заканчивается символом новой строки, некоторые содержат внутренние символы новой строки. Если эти строки объединить и вывести на печать, будет напечатан в точности тот же текст, что и при вызове196197[`print_exception()`](https://python-all.ru/3.0/library/traceback.html#traceback.print_exception)198199.200201#### `[traceback.format_exc]traceback.format_exc([limit[, chain]])`202203То же, что204205`print_exc(limit)`206207, но возвращает строку, а не выводит в файл.208209#### `[traceback.format_tb]traceback.format_tb(tb[, limit])`210211Сокращение для212213`format_list(extract_tb(tb, limit))`214215.216217#### `[traceback.format_stack]traceback.format_stack([f[, limit]])`218219Сокращённая запись для220221`format_list(extract_stack(f, limit))`222223.224225## Примеры traceback226227Этот простой пример реализует базовый цикл read-eval-print, похожий на стандартный интерактивный цикл интерпретатора Python (но менее полезный). Для более полной реализации цикла интерпретатора обратитесь к модулю [`code`](https://python-all.ru/3.0/library/code.html#module-code).228229```python230import sys, traceback231232def run_user_code(envdir):233 source = input(">>> ")234 try:235 exec(source, envdir)236 except:237 print("Exception in user code:")238 print("-"*60)239 traceback.print_exc(file=sys.stdout)240 print("-"*60)241242envdir = {}243while True:244 run_user_code(envdir)245```246247Следующий пример демонстрирует различные способы вывода и форматирования исключения и трассировки:248249```python250import sys, traceback251252def lumberjack():253 bright_side_of_death()254255def bright_side_of_death():256 return tuple()[0]257258try:259 lumberjack()260except:261 exceptionType, exceptionValue, exceptionTraceback = sys.exc_info()262 print("*** print_tb:")263 traceback.print_tb(exceptionTraceback, limit=1, file=sys.stdout)264 print("*** print_exception:")265 traceback.print_exception(exceptionType, exceptionValue, exceptionTraceback,266 limit=2, file=sys.stdout)267 print("*** print_exc:")268 traceback.print_exc()269 print("*** format_exc, first and last line:")270 formatted_lines = traceback.format_exc().splitlines()271 print(formatted_lines[0])272 print(formatted_lines[-1])273 print("*** format_exception:")274 print(repr(traceback.format_exception(exceptionType, exceptionValue,275 exceptionTraceback)))276 print("*** extract_tb:")277 print(repr(traceback.extract_tb(exceptionTraceback)))278 print("*** format_tb:")279 print(repr(traceback.format_tb(exceptionTraceback)))280 print("*** tb_lineno:", traceback.tb_lineno(exceptionTraceback))281print("*** print_last:")282traceback.print_last()283```284285Вывод для примера будет выглядеть примерно так:286287```python288*** print_tb:289 File "<doctest>", line 9, in <module>290 lumberjack()291*** print_exception:292Traceback (most recent call last):293 File "<doctest>", line 9, in <module>294 lumberjack()295 File "<doctest>", line 3, in lumberjack296 bright_side_of_death()297IndexError: tuple index out of range298*** print_exc:299Traceback (most recent call last):300 File "<doctest>", line 9, in <module>301 lumberjack()302 File "<doctest>", line 3, in lumberjack303 bright_side_of_death()304IndexError: tuple index out of range305*** format_exc, first and last line:306Traceback (most recent call last):307IndexError: tuple index out of range308*** format_exception:309['Traceback (most recent call last):\n',310 ' File "<doctest>", line 9, in <module>\n lumberjack()\n',311 ' File "<doctest>", line 3, in lumberjack\n bright_side_of_death()\n',312 ' File "<doctest>", line 6, in bright_side_of_death\n return tuple()[0]\n',313 'IndexError: tuple index out of range\n']314*** extract_tb:315[('<doctest>', 9, '<module>', 'lumberjack()'),316 ('<doctest>', 3, 'lumberjack', 'bright_side_of_death()'),317 ('<doctest>', 6, 'bright_side_of_death', 'return tuple()[0]')]318*** format_tb:319[' File "<doctest>", line 9, in <module>\n lumberjack()\n',320 ' File "<doctest>", line 3, in lumberjack\n bright_side_of_death()\n',321 ' File "<doctest>", line 6, in bright_side_of_death\n return tuple()[0]\n']322*** tb_lineno: 2323*** print_last:324Traceback (most recent call last):325 File "<doctest>", line 9, in <module>326 lumberjack()327 File "<doctest>", line 3, in lumberjack328 bright_side_of_death()329IndexError: tuple index out of range330```331332Следующий пример показывает различные способы вывода и форматирования стека:333334```python335>>> import traceback336>>> def another_function():337... lumberstack()338...339>>> def lumberstack():340... traceback.print_stack()341... print(repr(traceback.extract_stack()))342... print(repr(traceback.format_stack()))343...344>>> another_function()345 File "<doctest>", line 10, in <module>346 another_function()347 File "<doctest>", line 3, in another_function348 lumberstack()349 File "<doctest>", line 6, in lumberstack350 traceback.print_stack()351[('<doctest>', 10, '<module>', 'another_function()'),352 ('<doctest>', 3, 'another_function', 'lumberstack()'),353 ('<doctest>', 7, 'lumberstack', 'print(repr(traceback.extract_stack()))')]354[' File "<doctest>", line 10, in <module>\n another_function()\n',355 ' File "<doctest>", line 3, in another_function\n lumberstack()\n',356 ' File "<doctest>", line 8, in lumberstack\n print(repr(traceback.format_stack()))\n']357```358359Этот последний пример демонстрирует несколько последних функций форматирования:360361```python362>>> import traceback363>>> format_list([('spam.py', 3, '<module>', 'spam.eggs()'),364... ('eggs.py', 42, 'eggs', 'return "bacon"')])365[' File "spam.py", line 3, in <module>\n spam.eggs()\n',366 ' File "eggs.py", line 42, in eggs\n return "bacon"\n']367>>> theError = IndexError('tuple indx out of range')368>>> traceback.format_exception_only(type(theError), theError)369['IndexError: tuple index out of range\n']370```371