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

traceback.md

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

1> **Источник:** https://python-all.ru/3.12/library/traceback.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `traceback` – печать или получение трассировки стека89**Исходный код:** [Lib/traceback.py](https://python-all.ru/src/3.12/Lib/traceback.py)1011---1213Этот модуль предоставляет стандартный интерфейс для извлечения, форматирования и печати трассировок стека программ Python. Он более гибкий, чем стандартный вывод трассировки интерпретатора, и поэтому позволяет настраивать некоторые аспекты вывода. Наконец, он содержит утилиту для захвата достаточной информации об исключении, чтобы вывести её позже, без необходимости сохранять ссылку на само исключение. Поскольку исключения могут быть корнями больших графов объектов, эта утилита может значительно улучшить управление памятью.1415Модуль использует [объекты traceback](https://python-all.ru/3.12/reference/datamodel.html#traceback-objects) – это объекты типа [`types.TracebackType`](https://python-all.ru/3.12/library/types.html#types.TracebackType), которые присваиваются полю [`__traceback__`](https://python-all.ru/3.12/library/exceptions.html#BaseException.__traceback__) экземпляров [`BaseException`](https://python-all.ru/3.12/library/exceptions.html#BaseException).1617> **См. также**18>19> **Модуль [`faulthandler`](https://python-all.ru/3.12/library/faulthandler.html#module-faulthandler)**20>21> Используется для явного дампа трассировок Python при сбое, по таймауту или по сигналу пользователя.22>23> **Модуль [`pdb`](https://python-all.ru/3.12/library/pdb.html#module-pdb)**24>25> Интерактивный отладчик исходного кода для программ на Python.2627API модуля можно разделить на две части:2829- Функции уровня модуля, предоставляющие базовую функциональность, которые полезны для интерактивного анализа исключений и трассировок.30- Класс [`TracebackException`](https://python-all.ru/3.12/library/traceback.html#traceback.TracebackException) и его вспомогательные классы [`StackSummary`](https://python-all.ru/3.12/library/traceback.html#traceback.StackSummary) и [`FrameSummary`](https://python-all.ru/3.12/library/traceback.html#traceback.FrameSummary). Они обеспечивают как большую гибкость формируемого вывода, так и возможность хранить информацию, необходимую для последующего форматирования, без сохранения ссылок на фактические объекты исключений и трассировок.3132## Функции уровня модуля3334#### `traceback.print_tb(tb, limit=None, file=None)`3536Выводит до *limit* записей трассировки стека из [объекта traceback](https://python-all.ru/3.12/reference/datamodel.html#traceback-objects) *tb* (начиная с фрейма вызывающего), если *limit* положителен. В противном случае выводит последние `abs(limit)` записей. Если *limit* опущен или равен `None`, выводятся все записи. Если *file* опущен или равен `None`, вывод направляется в [`sys.stderr`](https://python-all.ru/3.12/library/sys.html#sys.stderr); в противном случае он должен быть открытым [файлом](https://python-all.ru/3.12/glossary.html#term-file-object) или [объектом, подобным файлу](https://python-all.ru/3.12/glossary.html#term-file-like-object), для получения вывода.3738> **Примечание**39>40> Смысл параметра *limit* отличается от смысла [`sys.tracebacklimit`](https://python-all.ru/3.12/library/sys.html#sys.tracebacklimit). Отрицательное значение *limit* соответствует положительному значению `sys.tracebacklimit`, тогда как поведение положительного значения *limit* нельзя получить с помощью `sys.tracebacklimit`.4142Изменено в версии 3.5: Добавлена поддержка отрицательного значения *limit*.4344#### `traceback.print_exception(exc, /, [value, tb, ]limit=None, file=None, chain=True)`4546Выводит информацию об исключении и записи трассировки стека из [объекта traceback](https://python-all.ru/3.12/reference/datamodel.html#traceback-objects) *tb* в *file*. Отличается от [`print_tb()`](https://python-all.ru/3.12/library/traceback.html#traceback.print_tb) следующим:4748- если *tb* не равен `None`, выводится заголовок `Traceback (most recent call last):`49- он выводит тип исключения и *value* после трассировки стека5051- если *type(value)* равен [`SyntaxError`](https://python-all.ru/3.12/library/exceptions.html#SyntaxError) и *value* имеет соответствующий формат, выводится строка, в которой произошла синтаксическая ошибка, с символом «^», указывающим приблизительную позицию ошибки.5253Начиная с Python 3.10, вместо передачи *value* и *tb* первым аргументом можно передавать объект исключения. Если *value* и *tb* указаны, первый аргумент игнорируется для обеспечения обратной совместимости.5455Необязательный аргумент *limit* имеет тот же смысл, что и для [`print_tb()`](https://python-all.ru/3.12/library/traceback.html#traceback.print_tb). Если *chain* равен true (по умолчанию), то также выводятся связанные исключения (атрибуты [`__cause__`](https://python-all.ru/3.12/library/exceptions.html#BaseException.__cause__) или [`__context__`](https://python-all.ru/3.12/library/exceptions.html#BaseException.__context__) исключения), как это делает сам интерпретатор при выводе необработанного исключения.5657Изменено в версии 3.5: Аргумент *etype* игнорируется и определяется по типу *value*.5859Изменено в версии 3.10: Параметр *etype* переименован в *exc* и теперь является только позиционным.6061#### `traceback.print_exc(limit=None, file=None, chain=True)`6263Это сокращение для `print_exception(sys.exception(), limit=limit, file=file, chain=chain)`.6465#### `traceback.print_last(limit=None, file=None, chain=True)`6667Это сокращение для `print_exception(sys.last_exc, limit=limit, file=file, chain=chain)`. Обычно оно работает только после того, как исключение достигло интерактивного приглашения (см. [`sys.last_exc`](https://python-all.ru/3.12/library/sys.html#sys.last_exc)).6869#### `traceback.print_stack(f=None, limit=None, file=None)`7071Выводит до *limit* записей трассировки стека (начиная с точки вызова), если *limit* положителен. В противном случае выводит последние `abs(limit)` записей. Если *limit* опущен или равен `None`, выводятся все записи. Необязательный аргумент *f* можно использовать для указания альтернативного [фрейма стека](https://python-all.ru/3.12/reference/datamodel.html#frame-objects), с которого начинать. Необязательный аргумент *file* имеет тот же смысл, что и для [`print_tb()`](https://python-all.ru/3.12/library/traceback.html#traceback.print_tb).7273Изменено в версии 3.5: Добавлена поддержка отрицательного значения *limit*.7475#### `traceback.extract_tb(tb, limit=None)`7677Возвращает объект [`StackSummary`](https://python-all.ru/3.12/library/traceback.html#traceback.StackSummary), представляющий список «предварительно обработанных»\\nзаписей трассировки стека, извлечённых из\\n[объекта traceback](https://python-all.ru/3.12/reference/datamodel.html#traceback-objects) *tb*. Это полезно\\nдля альтернативного форматирования трассировок стека. Необязательный аргумент *limit* имеет\\nто же значение, что и для [`print_tb()`](https://python-all.ru/3.12/library/traceback.html#traceback.print_tb). «Предварительно обработанная» запись\\nтрассировки стека – это объект [`FrameSummary`](https://python-all.ru/3.12/library/traceback.html#traceback.FrameSummary), содержащий атрибуты\\n[`filename`](https://python-all.ru/3.12/library/traceback.html#traceback.FrameSummary.filename), [`lineno`](https://python-all.ru/3.12/library/traceback.html#traceback.FrameSummary.lineno),\\n[`name`](https://python-all.ru/3.12/library/traceback.html#traceback.FrameSummary.name) и [`line`](https://python-all.ru/3.12/library/traceback.html#traceback.FrameSummary.line), представляющие\\nинформацию, которая обычно выводится для трассировки стека.7879#### `traceback.extract_stack(f=None, limit=None)`8081Извлекает необработанную трассировку из текущего [фрейма стека](https://python-all.ru/3.12/reference/datamodel.html#frame-objects). Возвращаемое значение имеет тот же формат, что и для [`extract_tb()`](https://python-all.ru/3.12/library/traceback.html#traceback.extract_tb). Необязательные аргументы *f* и *limit* имеют тот же смысл, что и для [`print_stack()`](https://python-all.ru/3.12/library/traceback.html#traceback.print_stack).8283#### `traceback.print_list(extracted_list, file=None)`8485Выводит список кортежей, возвращаемый [`extract_tb()`](https://python-all.ru/3.12/library/traceback.html#traceback.extract_tb) или [`extract_stack()`](https://python-all.ru/3.12/library/traceback.html#traceback.extract_stack), в виде форматированной трассировки стека в указанный файл. Если *file* равен `None`, вывод направляется в [`sys.stderr`](https://python-all.ru/3.12/library/sys.html#sys.stderr).8687#### `traceback.format_list(extracted_list)`8889Принимает список кортежей или объектов [`FrameSummary`](https://python-all.ru/3.12/library/traceback.html#traceback.FrameSummary), возвращённых [`extract_tb()`](https://python-all.ru/3.12/library/traceback.html#traceback.extract_tb) или [`extract_stack()`](https://python-all.ru/3.12/library/traceback.html#traceback.extract_stack), и возвращает список строк, готовых к выводу. Каждая строка в результирующем списке соответствует элементу с тем же индексом в исходном списке. Каждая строка заканчивается символом новой строки; строки могут также содержать внутренние переводы строк для тех элементов, чья строка исходного текста не равна `None`.9091#### `traceback.format_exception_only(exc, /[, value])`9293Форматирует часть трассировки стека, относящуюся к исключению, используя значение исключения, например возвращаемое [`sys.last_value`](https://python-all.ru/3.12/library/sys.html#sys.last_value). Возвращаемое значение – список строк, каждая заканчивается символом новой строки. Список содержит сообщение исключения, которое обычно представляет собой одну строку; однако для исключений [`SyntaxError`](https://python-all.ru/3.12/library/exceptions.html#SyntaxError) он содержит несколько строк, которые (при выводе на печать) отображают подробную информацию о том, где произошла синтаксическая ошибка. После сообщения список содержит [`notes`](https://python-all.ru/3.12/library/exceptions.html#BaseException.__notes__) исключения.9495Начиная с Python 3.10, вместо передачи *value* в качестве первого аргумента можно передавать объект исключения. Если передан *value*, первый аргумент игнорируется для обеспечения обратной совместимости.9697Изменено в версии 3.10: Параметр *etype* переименован в *exc* и теперь является только позиционным.9899Изменено в версии 3.11: Возвращаемый список теперь включает любые [`notes`](https://python-all.ru/3.12/library/exceptions.html#BaseException.__notes__), присоединённые к исключению.100101#### `traceback.format_exception(exc, /, [value, tb, ]limit=None, chain=True)`102103Форматирует трассировку стека и информацию об исключении. Аргументы имеют тот же смысл, что и соответствующие аргументы [`print_exception()`](https://python-all.ru/3.12/library/traceback.html#traceback.print_exception). Возвращаемое значение – список строк, каждая заканчивается символом новой строки, некоторые содержат внутренние переводы строк. При объединении и выводе этих строк печатается в точности тот же текст, что и при вызове [`print_exception()`](https://python-all.ru/3.12/library/traceback.html#traceback.print_exception).104105Изменено в версии 3.5: Аргумент *etype* игнорируется и определяется по типу *value*.106107Изменено в версии 3.10: Поведение и сигнатура этой функции были изменены в соответствии с [`print_exception()`](https://python-all.ru/3.12/library/traceback.html#traceback.print_exception).108109#### `traceback.format_exc(limit=None, chain=True)`110111Аналог `print_exc(limit)`, но возвращает строку вместо вывода в файл.112113#### `traceback.format_tb(tb, limit=None)`114115Сокращение для `format_list(extract_tb(tb, limit))`.116117#### `traceback.format_stack(f=None, limit=None)`118119Сокращение для `format_list(extract_stack(f, limit))`.120121#### `traceback.clear_frames(tb)`122123Очищает локальные переменные всех фреймов стека в [traceback](https://python-all.ru/3.12/reference/datamodel.html#traceback-objects) *tb*, вызывая метод [`clear()`](https://python-all.ru/3.12/reference/datamodel.html#frame.clear) для каждого [объекта фрейма](https://python-all.ru/3.12/reference/datamodel.html#frame-objects).124125Добавлено в версии 3.4.126127#### `traceback.walk_stack(f)`128129Обходит стек, следуя по [`f.f_back`](https://python-all.ru/3.12/reference/datamodel.html#frame.f_back) от указанного фрейма, возвращая фрейм и номер строки для каждого фрейма. Если *f* равен `None`, используется текущий стек. Эта вспомогательная функция используется с [`StackSummary.extract()`](https://python-all.ru/3.12/library/traceback.html#traceback.StackSummary.extract).130131Добавлено в версии 3.5.132133#### `traceback.walk_tb(tb)`134135Обходит трассировку стека, следуя по [`tb_next`](https://python-all.ru/3.12/reference/datamodel.html#traceback.tb_next), возвращая фрейм и номер строки для каждого фрейма. Эта вспомогательная функция используется с [`StackSummary.extract()`](https://python-all.ru/3.12/library/traceback.html#traceback.StackSummary.extract).136137Добавлено в версии 3.5.138139## `TracebackException` Объекты140141Добавлено в версии 3.5.142143Объекты `TracebackException` создаются на основе реальных исключений для захвата данных для последующей печати. Они предоставляют более лёгкий способ хранения этой информации, избегая хранения ссылок на объекты [traceback](https://python-all.ru/3.12/reference/datamodel.html#traceback-objects) и [frame](https://python-all.ru/3.12/reference/datamodel.html#frame-objects). Кроме того, по сравнению с функциями уровня модуля, описанными выше, они предоставляют больше возможностей для настройки вывода.144145#### `class traceback.TracebackException(exc_type, exc_value, exc_traceback, *, limit=None, lookup_lines=True, capture_locals=False, compact=False, max_group_width=15, max_group_depth=10)`146147Захватывает исключение для последующего отображения. Значения *limit*, *lookup\_lines* и *capture\_locals* такие же, как для класса [`StackSummary`](https://python-all.ru/3.12/library/traceback.html#traceback.StackSummary).148149Если *compact* равен true, в атрибутах класса сохраняются только данные, необходимые методу `TracebackException` [`format()`](https://python-all.ru/3.12/library/functions.html#format). В частности, поле [`__context__`](https://python-all.ru/3.12/library/traceback.html#traceback.TracebackException.__context__) вычисляется только если [`__cause__`](https://python-all.ru/3.12/library/traceback.html#traceback.TracebackException.__cause__) равен `None` и [`__suppress_context__`](https://python-all.ru/3.12/library/traceback.html#traceback.TracebackException.__suppress_context__) равен false.150151Обратите внимание, что при захвате локальных переменных они также отображаются в трассировке.152153Параметры *max\_group\_width* и *max\_group\_depth* управляют форматированием групп исключений (см. [`BaseExceptionGroup`](https://python-all.ru/3.12/library/exceptions.html#BaseExceptionGroup)). Глубина относится к уровню вложенности группы, а ширина – к размеру массива исключений одной группы исключений. Отформатированный вывод усекается при превышении любого из этих ограничений.154155Изменено в версии 3.10: Добавлен параметр *compact*.156157Изменено в версии 3.11: Добавлены параметры *max\_group\_width* и *max\_group\_depth*.158159#### `__cause__`160161`TracebackException` исходного [`__cause__`](https://python-all.ru/3.12/library/exceptions.html#BaseException.__cause__).162163#### `__context__`164165`TracebackException` исходного [`__context__`](https://python-all.ru/3.12/library/exceptions.html#BaseException.__context__).166167#### `exceptions`168169Если `self` представляет собой [`ExceptionGroup`](https://python-all.ru/3.12/library/exceptions.html#ExceptionGroup), это поле содержит список экземпляров `TracebackException`, представляющих вложенные исключения. В противном случае это `None`.170171Добавлено в версии 3.12.172173#### `__suppress_context__`174175Значение [`__suppress_context__`](https://python-all.ru/3.12/library/exceptions.html#BaseException.__suppress_context__) из исходного исключения.176177#### `__notes__`178179Значение [`__notes__`](https://python-all.ru/3.12/library/exceptions.html#BaseException.__notes__) из исходного исключения или `None`, если у исключения нет заметок. Если это не `None`, то оно форматируется в трассировке после строки исключения.180181Добавлено в версии 3.12.182183#### `stack`184185[`StackSummary`](https://python-all.ru/3.12/library/traceback.html#traceback.StackSummary), представляющий трассировку.186187#### `exc_type`188189Класс исходной обратной трассировки.190191#### `filename`192193Для синтаксических ошибок – имя файла, в котором произошла ошибка.194195#### `lineno`196197Для синтаксических ошибок – номер строки, в которой произошла ошибка.198199#### `end_lineno`200201Для синтаксических ошибок – номер конечной строки, в которой произошла ошибка. Может быть `None`, если отсутствует.202203Добавлено в версии 3.10.204205#### `text`206207Для синтаксических ошибок – текст, в котором произошла ошибка.208209#### `offset`210211Для синтаксических ошибок – смещение в тексте, где произошла ошибка.212213#### `end_offset`214215Для синтаксических ошибок – конечное смещение в тексте, где произошла ошибка. Может быть `None`, если отсутствует.216217Добавлено в версии 3.10.218219#### `msg`220221Для синтаксических ошибок – сообщение об ошибке компилятора.222223#### `classmethod from_exception(exc, *, limit=None, lookup_lines=True, capture_locals=False)`224225Захватывает исключение для последующего отображения. Параметры *limit*, *lookup\_lines* и *capture\_locals* такие же, как для класса [`StackSummary`](https://python-all.ru/3.12/library/traceback.html#traceback.StackSummary).226227Обратите внимание, что при захвате локальных переменных они также отображаются в трассировке.228229#### `print(*, file=None, chain=True)`230231Выводит в *file* (по умолчанию `sys.stderr`) информацию об исключении, возвращённую [`format()`](https://python-all.ru/3.12/library/functions.html#format).232233Добавлено в версии 3.12.234235#### `format(*, chain=True)`236237Форматирует исключение.238239Если *chain* не равно `True`, то [`__cause__`](https://python-all.ru/3.12/library/traceback.html#traceback.TracebackException.__cause__) и [`__context__`](https://python-all.ru/3.12/library/traceback.html#traceback.TracebackException.__context__) не будут отформатированы.240241Возвращаемое значение – генератор строк, каждая из которых завершается символом новой строки, и некоторые содержат внутренние переводы строк. [`print_exception()`](https://python-all.ru/3.12/library/traceback.html#traceback.print_exception) является обёрткой вокруг этого метода, которая просто выводит строки в файл.242243#### `format_exception_only()`244245Форматирует часть трассировки, относящуюся к исключению.246247Возвращаемое значение – генератор строк, каждая из которых завершается символом новой строки.248249Генератор выдаёт сообщение исключения, за которым следуют его примечания\\n(если они есть). Сообщение об исключении обычно представляет собой одну строку;\\nоднако для исключений [`SyntaxError`](https://python-all.ru/3.12/library/exceptions.html#SyntaxError) оно состоит из нескольких\\nстрок, которые при выводе отображают подробную информацию о том, где\\nпроизошла синтаксическая ошибка.250251Изменено в версии 3.11: Примечания исключения ([`notes`](https://python-all.ru/3.12/library/exceptions.html#BaseException.__notes__)) теперь включаются в вывод.252253## `StackSummary` Объекты254255Добавлено в версии 3.5.256257Объекты `StackSummary` представляют стек вызовов, готовый к форматированию.258259#### `class traceback.StackSummary`260261#### `classmethod extract(frame_gen, *, limit=None, lookup_lines=True, capture_locals=False)`262263Создаёт объект `StackSummary` из генератора фреймов (такого, как возвращается [`walk_stack()`](https://python-all.ru/3.12/library/traceback.html#traceback.walk_stack) или [`walk_tb()`](https://python-all.ru/3.12/library/traceback.html#traceback.walk_tb)).264265Если указан параметр *limit*, из *frame\_gen* берётся только указанное количество фреймов. Если *lookup\_lines* равно `False`, возвращённые объекты [`FrameSummary`](https://python-all.ru/3.12/library/traceback.html#traceback.FrameSummary) ещё не прочитают свои строки, что удешевляет создание `StackSummary` (это может быть полезно, если он, возможно, не будет фактически отформатирован). Если *capture\_locals* равно `True`, локальные переменные в каждом `FrameSummary` захватываются в виде представления объектов.266267Изменено в версии 3.12: Исключения, возникающие в [`repr()`](https://python-all.ru/3.12/library/functions.html#repr) для локальной переменной (когда *capture\_locals* равно `True`), больше не распространяются на вызывающий код.268269#### `classmethod from_list(a_list)`270271Создаёт объект `StackSummary` из предоставленного списка объектов [`FrameSummary`](https://python-all.ru/3.12/library/traceback.html#traceback.FrameSummary) или списка кортежей старого образца. Каждый кортеж должен быть кортежем из 4 элементов: *filename*, *lineno*, *name*, *line*.272273#### `format()`274275Возвращает список строк, готовых к печати. Каждая строка в результирующем списке соответствует одному [фрейму](https://python-all.ru/3.12/reference/datamodel.html#frame-objects) из стека. Каждая строка заканчивается символом новой строки; строки также могут содержать внутренние переводы строк – для тех элементов, у которых есть строки исходного кода.276277Для длинных последовательностей одинаковых фреймов и строк сначала показываются первые несколько повторений, а затем сводная строка с указанием точного числа последующих повторений.278279Изменено в версии 3.6: Длинные последовательности повторяющихся фреймов теперь сокращаются.280281#### `format_frame_summary(frame_summary)`282283Возвращает строку для печати одного из [фреймов](https://python-all.ru/3.12/reference/datamodel.html#frame-objects), входящих в стек. Этот метод вызывается для каждого объекта [`FrameSummary`](https://python-all.ru/3.12/library/traceback.html#traceback.FrameSummary), который должен быть выведен методом [`StackSummary.format()`](https://python-all.ru/3.12/library/traceback.html#traceback.StackSummary.format). Если он возвращает `None`, то фрейм пропускается в выводе.284285Добавлено в версии 3.12.286287## `FrameSummary` Объекты288289Добавлено в версии 3.5.290291Объект `FrameSummary` представляет отдельный [фрейм](https://python-all.ru/3.12/reference/datamodel.html#frame-objects) в [трассировке](https://python-all.ru/3.12/reference/datamodel.html#traceback-objects).292293#### `class traceback.FrameSummary(filename, lineno, name, *, lookup_line=True, locals=None, line=None, end_lineno=None, colno=None, end_colno=None)`294295Представляет отдельный [фрейм](https://python-all.ru/3.12/reference/datamodel.html#frame-objects) в [traceback](https://python-all.ru/3.12/reference/datamodel.html#traceback-objects) или стеке, который форматируется или выводится на печать. Он может опционально содержать строковое представление локальных переменных фрейма. Если *lookup\_line* равен `False`, исходный код не ищется до тех пор, пока у `FrameSummary` не будет получен доступ к атрибуту [`line`](https://python-all.ru/3.12/library/traceback.html#traceback.FrameSummary.line) (что также происходит при приведении его к [`tuple`](https://python-all.ru/3.12/library/stdtypes.html#tuple)). [`line`](https://python-all.ru/3.12/library/traceback.html#traceback.FrameSummary.line) может быть предоставлен напрямую, и это предотвратит любые поиски строк. *locals* – это необязательный словарь локальных переменных, и если он указан, представления переменных сохраняются в сводке для последующего отображения.296297Экземпляры `FrameSummary` имеют следующие атрибуты:298299#### `filename`300301Имя файла исходного кода для этого фрейма. Эквивалентно обращению к [`f.f_code.co_filename`](https://python-all.ru/3.12/reference/datamodel.html#codeobject.co_filename) для [объекта фрейма](https://python-all.ru/3.12/reference/datamodel.html#frame-objects) *f*.302303#### `lineno`304305Номер строки исходного кода для этого фрейма.306307#### `name`308309Эквивалентно обращению к [`f.f_code.co_name`](https://python-all.ru/3.12/reference/datamodel.html#codeobject.co_name) на [объекте кадра](https://python-all.ru/3.12/reference/datamodel.html#frame-objects) *f*.310311#### `line`312313Строка, представляющая исходный код для этого кадра, с удалёнными начальными и конечными пробелами. Если исходный код недоступен, это `None`.314315#### `end_lineno`316317Номер последней строки исходного кода для этого кадра. По умолчанию он равен `None`, а нумерация начинается с 1.318319#### `colno`320321Номер колонки исходного кода для этого кадра. По умолчанию он равен `None`, а нумерация начинается с 0.322323#### `end_colno`324325Номер последней колонки исходного кода для этого кадра. По умолчанию он равен `None`, а нумерация начинается с 0.326327## Примеры использования функций уровня модуля328329Этот простой пример реализует базовый цикл чтение-вычисление-печать, похожий на (но менее полезный, чем) стандартный цикл интерактивного интерпретатора Python. Для более полной реализации цикла интерпретатора обратитесь к модулю [`code`](https://python-all.ru/3.12/library/code.html#module-code).330331```python332import sys, traceback333334def run_user_code(envdir):335    source = input(">>> ")336    try:337        exec(source, envdir)338    except Exception:339        print("Exception in user code:")340        print("-"*60)341        traceback.print_exc(file=sys.stdout)342        print("-"*60)343344envdir = {}345while True:346    run_user_code(envdir)347```348349Следующий пример демонстрирует различные способы вывода и форматирования исключения и трассировки:350351```python352import sys, traceback353354def lumberjack():355    bright_side_of_life()356357def bright_side_of_life():358    return tuple()[0]359360try:361    lumberjack()362except IndexError as exc:363    print("*** print_tb:")364    traceback.print_tb(exc.__traceback__, limit=1, file=sys.stdout)365    print("*** print_exception:")366    traceback.print_exception(exc, limit=2, file=sys.stdout)367    print("*** print_exc:")368    traceback.print_exc(limit=2, file=sys.stdout)369    print("*** format_exc, first and last line:")370    formatted_lines = traceback.format_exc().splitlines()371    print(formatted_lines[0])372    print(formatted_lines[-1])373    print("*** format_exception:")374    print(repr(traceback.format_exception(exc)))375    print("*** extract_tb:")376    print(repr(traceback.extract_tb(exc.__traceback__)))377    print("*** format_tb:")378    print(repr(traceback.format_tb(exc.__traceback__)))379    print("*** tb_lineno:", exc.__traceback__.tb_lineno)380```381382Вывод для примера будет выглядеть примерно так:383384```text385*** print_tb:386  File "<doctest...>", line 10, in <module>387    lumberjack()388*** print_exception:389Traceback (most recent call last):390  File "<doctest...>", line 10, in <module>391    lumberjack()392  File "<doctest...>", line 4, in lumberjack393    bright_side_of_life()394IndexError: tuple index out of range395*** print_exc:396Traceback (most recent call last):397  File "<doctest...>", line 10, in <module>398    lumberjack()399  File "<doctest...>", line 4, in lumberjack400    bright_side_of_life()401IndexError: tuple index out of range402*** format_exc, first and last line:403Traceback (most recent call last):404IndexError: tuple index out of range405*** format_exception:406['Traceback (most recent call last):\n',407 '  File "<doctest default[0]>", line 10, in <module>\n    lumberjack()\n',408 '  File "<doctest default[0]>", line 4, in lumberjack\n    bright_side_of_life()\n',409 '  File "<doctest default[0]>", line 7, in bright_side_of_life\n    return tuple()[0]\n           ~~~~~~~^^^\n',410 'IndexError: tuple index out of range\n']411*** extract_tb:412[<FrameSummary file <doctest...>, line 10 in <module>>,413 <FrameSummary file <doctest...>, line 4 in lumberjack>,414 <FrameSummary file <doctest...>, line 7 in bright_side_of_life>]415*** format_tb:416['  File "<doctest default[0]>", line 10, in <module>\n    lumberjack()\n',417 '  File "<doctest default[0]>", line 4, in lumberjack\n    bright_side_of_life()\n',418 '  File "<doctest default[0]>", line 7, in bright_side_of_life\n    return tuple()[0]\n           ~~~~~~~^^^\n']419*** tb_lineno: 10420```421422Следующий пример показывает различные способы вывода и форматирования стека:423424```python425>>> import traceback426>>> def another_function():427...     lumberstack()428...429>>> def lumberstack():430...     traceback.print_stack()431...     print(repr(traceback.extract_stack()))432...     print(repr(traceback.format_stack()))433...434>>> another_function()435  File "<doctest>", line 10, in <module>436    another_function()437  File "<doctest>", line 3, in another_function438    lumberstack()439  File "<doctest>", line 6, in lumberstack440    traceback.print_stack()441[('<doctest>', 10, '<module>', 'another_function()'),442 ('<doctest>', 3, 'another_function', 'lumberstack()'),443 ('<doctest>', 7, 'lumberstack', 'print(repr(traceback.extract_stack()))')]444['  File "<doctest>", line 10, in <module>\n    another_function()\n',445 '  File "<doctest>", line 3, in another_function\n    lumberstack()\n',446 '  File "<doctest>", line 8, in lumberstack\n    print(repr(traceback.format_stack()))\n']447```448449Этот последний пример демонстрирует несколько последних функций форматирования:450451```pycon452>>> import traceback453>>> traceback.format_list([('spam.py', 3, '<module>', 'spam.eggs()'),454...                        ('eggs.py', 42, 'eggs', 'return "bacon"')])455['  File "spam.py", line 3, in <module>\n    spam.eggs()\n',456 '  File "eggs.py", line 42, in eggs\n    return "bacon"\n']457>>> an_error = IndexError('tuple index out of range')458>>> traceback.format_exception_only(an_error)459['IndexError: tuple index out of range\n']460```461462## Примеры использования [`TracebackException`](https://python-all.ru/3.12/library/traceback.html#traceback.TracebackException)463464С помощью вспомогательного класса появляется больше возможностей:465466```python467>>> import sys468>>> from traceback import TracebackException469>>>470>>> def lumberjack():471...     bright_side_of_life()472...473>>> def bright_side_of_life():474...     t = "bright", "side", "of", "life"475...     return t[5]476...477>>> try:478...     lumberjack()479... except IndexError as e:480...     exc = e481...482>>> try:483...     try:484...         lumberjack()485...     except:486...         1/0487... except Exception as e:488...     chained_exc = e489...490>>> # limit работает, как и функции уровня модуля491>>> TracebackException.from_exception(exc, limit=-2).print()492Traceback (most recent call last):493  File "<python-input-1>", line 6, in lumberjack494    bright_side_of_life()495    ~~~~~~~~~~~~~~~~~~~^^496  File "<python-input-1>", line 10, in bright_side_of_life497    return t[5]498           ~^^^499IndexError: tuple index out of range500501>>> # capture_locals добавляет локальные переменные в кадры стека502>>> TracebackException.from_exception(exc, limit=-2, capture_locals=True).print()503Traceback (most recent call last):504  File "<python-input-1>", line 6, in lumberjack505    bright_side_of_life()506    ~~~~~~~~~~~~~~~~~~~^^507  File "<python-input-1>", line 10, in bright_side_of_life508    return t[5]509           ~^^^510    t = ("bright", "side", "of", "life")511IndexError: tuple index out of range512513>>> # Именованный аргумент *chain* в print() управляет тем, показываются ли цепочки514>>> # исключений.515>>> TracebackException.from_exception(chained_exc).print()516Traceback (most recent call last):517  File "<python-input-19>", line 4, in <module>518    lumberjack()519    ~~~~~~~~~~^^520  File "<python-input-8>", line 7, in lumberjack521    bright_side_of_life()522    ~~~~~~~~~~~~~~~~~~~^^523  File "<python-input-8>", line 11, in bright_side_of_life524    return t[5]525           ~^^^526IndexError: tuple index out of range527528During handling of the above exception, another exception occurred:529530Traceback (most recent call last):531  File "<python-input-19>", line 6, in <module>532    1/0533    ~^~534ZeroDivisionError: division by zero535536>>> TracebackException.from_exception(chained_exc).print(chain=False)537Traceback (most recent call last):538  File "<python-input-19>", line 6, in <module>539    1/0540    ~^~541ZeroDivisionError: division by zero542```543