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

traceback.md

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

1> **Источник:** https://python-all.ru/2.7/library/traceback.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 28.10. [`traceback`](https://python-all.ru/2.7/library/traceback.html#module-traceback) – Вывод или получение трассировки стека89Этот модуль предоставляет стандартный интерфейс для извлечения, форматирования и печати трассировок стека программ Python. Он в точности повторяет поведение интерпретатора Python при печати трассировки стека. Это полезно, когда требуется печатать трассировки стека программно, например, в «обёртке» вокруг интерпретатора.1011Модуль использует объекты трассировки – это тип объекта, который хранится в переменных [`sys.exc_traceback`](https://python-all.ru/2.7/library/sys.html#sys.exc_traceback) (устарело) и [`sys.last_traceback`](https://python-all.ru/2.7/library/sys.html#sys.last_traceback), а также возвращается третьим элементом из [`sys.exc_info()`](https://python-all.ru/2.7/library/sys.html#sys.exc_info).1213Модуль определяет следующие функции:1415#### `traceback.print_tb(tb[, limit[, file]])`1617Печатает до *limit* записей трассировки стека из объекта трассировки *tb*. Если *limit* опущен или равен `None`, печатаются все записи. Если *file* опущен или равен `None`, вывод направляется в `sys.stderr`; в противном случае это должен быть открытый файл или файлоподобный объект, принимающий вывод.1819#### `traceback.print_exception(etype, value, tb[, limit[, file]])`2021Печатает информацию об исключении и до *limit* записей трассировки стека из объекта трассировки *tb* в *file*. Эта функция отличается от [`print_tb()`](https://python-all.ru/2.7/library/traceback.html#traceback.print_tb) следующим: (1) если *tb* не `None`, сначала печатается заголовок `Traceback (most recent call last):`; (2) после трассировки стека печатаются тип исключения *etype* и значение *value*; (3) если *etype* равен [`SyntaxError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.SyntaxError) и *value* имеет подходящий формат, печатается строка, в которой произошла синтаксическая ошибка, с курсором, указывающим примерное положение ошибки.2223#### `traceback.print_exc([limit[, file]])`2425Это сокращение для `print_exception(sys.exc_type, sys.exc_value, sys.exc_traceback, limit, file)`. (Фактически он использует [`sys.exc_info()`](https://python-all.ru/2.7/library/sys.html#sys.exc_info) для получения той же информации потокобезопасным способом, вместо использования устаревших переменных.)2627#### `traceback.format_exc([limit])`2829Аналог `print_exc(limit)`, но возвращает строку вместо вывода в файл.3031Новое в версии 2.4.3233#### `traceback.print_last([limit[, file]])`3435Это сокращение для `print_exception(sys.last_type, sys.last_value, sys.last_traceback, limit, file)`. В общем случае оно будет работать только после того, как исключение достигло интерактивного приглашения (см. [`sys.last_type`](https://python-all.ru/2.7/library/sys.html#sys.last_type)).3637#### `traceback.print_stack([f[, limit[, file]]])`3839Эта функция печатает трассировку стека от точки вызова. Необязательный аргумент *f* можно использовать для указания альтернативного кадра стека, с которого начать. Необязательные аргументы *limit* и *file* имеют тот же смысл, что и для [`print_exception()`](https://python-all.ru/2.7/library/traceback.html#traceback.print_exception).4041#### `traceback.extract_tb(tb[, limit])`4243Возвращает список до *limit* «предварительно обработанных» записей трассировки стека, извлечённых из объекта трассировки *tb*. Полезен для альтернативного форматирования трассировок стека. Если *limit* опущен или равен `None`, извлекаются все записи. «Предварительно обработанная» запись трассировки стека – это кортеж из 4 элементов: (*filename*, *line number*, function name\*, *text*), представляющий информацию, которая обычно печатается для трассировки стека. *text* – это строка с удалёнными начальными и конечными пробелами; если исходный код недоступен, он равен `None`.4445#### `traceback.extract_stack([f[, limit]])`4647Извлекает необработанную трассировку из текущего стекового фрейма. Возвращаемое значение имеет тот же формат, что и для [`extract_tb()`](https://python-all.ru/2.7/library/traceback.html#traceback.extract_tb). Необязательные аргументы *f* и *limit* имеют то же значение, что и для [`print_stack()`](https://python-all.ru/2.7/library/traceback.html#traceback.print_stack).4849#### `traceback.format_list(extracted_list)`5051Получая список кортежей, возвращённый [`extract_tb()`](https://python-all.ru/2.7/library/traceback.html#traceback.extract_tb) или [`extract_stack()`](https://python-all.ru/2.7/library/traceback.html#traceback.extract_stack), возвращает список строк, готовых для печати. Каждая строка в результирующем списке соответствует элементу с тем же индексом в исходном списке. Каждая строка завершается символом новой строки; строки могут также содержать внутренние переводы строк для тех элементов, у которых строка исходного текста не равна `None`.5253#### `traceback.format_exception_only(etype, value)`5455Форматирует часть трассировки, относящуюся к исключению. Аргументы – тип исключения *etype* и значение *value*, такие как возвращаемые `sys.last_type` и `sys.last_value`. Возвращаемое значение – список строк, каждая из которых заканчивается символом новой строки. Обычно список содержит одну строку; однако для исключений [`SyntaxError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.SyntaxError) он содержит несколько строк, которые (при печати) отображают подробную информацию о том, где произошла синтаксическая ошибка. Сообщение, указывающее, какое исключение произошло, всегда является последней строкой в списке.5657#### `traceback.format_exception(etype, value, tb[, limit])`5859Форматирует трассировку стека и информацию об исключении. Аргументы имеют тот же смысл, что и соответствующие аргументы [`print_exception()`](https://python-all.ru/2.7/library/traceback.html#traceback.print_exception). Возвращаемое значение – список строк, каждая заканчивается символом новой строки, некоторые содержат внутренние переводы строк. При объединении и выводе этих строк печатается в точности тот же текст, что и при вызове [`print_exception()`](https://python-all.ru/2.7/library/traceback.html#traceback.print_exception).6061#### `traceback.format_tb(tb[, limit])`6263Сокращение для `format_list(extract_tb(tb, limit))`.6465#### `traceback.format_stack([f[, limit]])`6667Сокращение для `format_list(extract_stack(f, limit))`.6869#### `traceback.tb_lineno(tb)`7071Эта функция возвращает текущий номер строки, установленный в объекте трассировки. Эта функция была необходима, потому что в версиях Python до 2.3, когда [`-O`](https://python-all.ru/2.7/using/cmdline.html#cmdoption-o) флаг передавался Python, `tb.tb_lineno` не обновлялся корректно. В версиях после 2.3 эта функция не нужна.7273## 28.10.1. Примеры трассировки7475Этот простой пример реализует базовый цикл чтение-вычисление-печать, похожий на (но менее полезный, чем) стандартный цикл интерактивного интерпретатора Python. Для более полной реализации цикла интерпретатора обратитесь к модулю [`code`](https://python-all.ru/2.7/library/code.html#module-code).7677```python78import sys, traceback7980def run_user_code(envdir):81    source = raw_input(">>> ")82    try:83        exec source in envdir84    except:85        print "Exception in user code:"86        print '-'*6087        traceback.print_exc(file=sys.stdout)88        print '-'*608990envdir = {}91while 1:92    run_user_code(envdir)93```9495Следующий пример демонстрирует различные способы вывода и форматирования исключения и трассировки:9697```python98import sys, traceback99100def lumberjack():101    bright_side_of_death()102103def bright_side_of_death():104    return tuple()[0]105106try:107    lumberjack()108except IndexError:109    exc_type, exc_value, exc_traceback = sys.exc_info()110    print "*** print_tb:"111    traceback.print_tb(exc_traceback, limit=1, file=sys.stdout)112    print "*** print_exception:"113    traceback.print_exception(exc_type, exc_value, exc_traceback,114                              limit=2, file=sys.stdout)115    print "*** print_exc:"116    traceback.print_exc()117    print "*** format_exc, first and last line:"118    formatted_lines = traceback.format_exc().splitlines()119    print formatted_lines[0]120    print formatted_lines[-1]121    print "*** format_exception:"122    print repr(traceback.format_exception(exc_type, exc_value,123                                          exc_traceback))124    print "*** extract_tb:"125    print repr(traceback.extract_tb(exc_traceback))126    print "*** format_tb:"127    print repr(traceback.format_tb(exc_traceback))128    print "*** tb_lineno:", exc_traceback.tb_lineno129```130131Вывод для примера будет выглядеть примерно так:132133```python134*** print_tb:135  File "<doctest...>", line 10, in <module>136    lumberjack()137*** print_exception:138Traceback (most recent call last):139  File "<doctest...>", line 10, in <module>140    lumberjack()141  File "<doctest...>", line 4, in lumberjack142    bright_side_of_death()143IndexError: tuple index out of range144*** print_exc:145Traceback (most recent call last):146  File "<doctest...>", line 10, in <module>147    lumberjack()148  File "<doctest...>", line 4, in lumberjack149    bright_side_of_death()150IndexError: tuple index out of range151*** format_exc, first and last line:152Traceback (most recent call last):153IndexError: tuple index out of range154*** format_exception:155['Traceback (most recent call last):\n',156 '  File "<doctest...>", line 10, in <module>\n    lumberjack()\n',157 '  File "<doctest...>", line 4, in lumberjack\n    bright_side_of_death()\n',158 '  File "<doctest...>", line 7, in bright_side_of_death\n    return tuple()[0]\n',159 'IndexError: tuple index out of range\n']160*** extract_tb:161[('<doctest...>', 10, '<module>', 'lumberjack()'),162 ('<doctest...>', 4, 'lumberjack', 'bright_side_of_death()'),163 ('<doctest...>', 7, 'bright_side_of_death', 'return tuple()[0]')]164*** format_tb:165['  File "<doctest...>", line 10, in <module>\n    lumberjack()\n',166 '  File "<doctest...>", line 4, in lumberjack\n    bright_side_of_death()\n',167 '  File "<doctest...>", line 7, in bright_side_of_death\n    return tuple()[0]\n']168*** tb_lineno: 10169```170171Следующий пример показывает различные способы вывода и форматирования стека:172173```python174>>> import traceback175>>> def another_function():176...     lumberstack()177...178>>> def lumberstack():179...     traceback.print_stack()180...     print repr(traceback.extract_stack())181...     print repr(traceback.format_stack())182...183>>> another_function()184  File "<doctest>", line 10, in <module>185    another_function()186  File "<doctest>", line 3, in another_function187    lumberstack()188  File "<doctest>", line 6, in lumberstack189    traceback.print_stack()190[('<doctest>', 10, '<module>', 'another_function()'),191 ('<doctest>', 3, 'another_function', 'lumberstack()'),192 ('<doctest>', 7, 'lumberstack', 'print repr(traceback.extract_stack())')]193['  File "<doctest>", line 10, in <module>\n    another_function()\n',194 '  File "<doctest>", line 3, in another_function\n    lumberstack()\n',195 '  File "<doctest>", line 8, in lumberstack\n    print repr(traceback.format_stack())\n']196```197198Этот последний пример демонстрирует несколько последних функций форматирования:199200```pycon201>>> import traceback202>>> traceback.format_list([('spam.py', 3, '<module>', 'spam.eggs()'),203...                        ('eggs.py', 42, 'eggs', 'return "bacon"')])204['  File "spam.py", line 3, in <module>\n    spam.eggs()\n',205 '  File "eggs.py", line 42, in eggs\n    return "bacon"\n']206>>> an_error = IndexError('tuple index out of range')207>>> traceback.format_exception_only(type(an_error), an_error)208['IndexError: tuple index out of range\n']209```210