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

traceback.md

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

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