> **Источник:** https://python-all.ru/3.0/library/traceback.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# `traceback` – печать или извлечение трассировки стека

Этот модуль предоставляет стандартный интерфейс для извлечения, форматирования и печати трассировок стека программ Python. Он в точности повторяет поведение интерпретатора Python при печати трассировки стека. Это полезно, когда требуется печатать трассировки стека программно, например, в «обёртке» вокруг интерпретатора.

Модуль использует объекты traceback – это тип объектов, который хранится в переменной `sys.last_traceback` и возвращается третьим элементом из [`sys.exc_info()`](https://python-all.ru/3.0/library/sys.html#sys.exc_info).

Модуль определяет следующие функции:

#### `[traceback.print_tb]traceback.print_tb(traceback[, limit[, file]])`

Выводит до

*limit*

записей стековой трассировки из

*traceback*

. Если

*limit*

опущен или равен

`None`

, выводятся все записи. Если

*file*

опущен или равен

`None`

, вывод направляется в

`sys.stderr`

; в противном случае это должен быть открытый файл или объект, подобный файлу, для получения вывода.

#### `[traceback.print_exception]traceback.print_exception(type, value, traceback[, limit[, file[, chain]]])`

Выводит информацию об исключении и до *limit* записей стековой трассировки из *traceback* в *file*. Отличается от [`print_tb()`](https://python-all.ru/3.0/library/traceback.html#traceback.print_tb) следующим:

- если *traceback* не равен `None`, выводится заголовок `Traceback (most recent call last):`
- выводит тип исключения *type* и *value* после стековой трассировки
- если *type* – [`SyntaxError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.SyntaxError), а *value* имеет соответствующий формат, то выводится строка с синтаксической ошибкой и символом «^», указывающим примерное положение ошибки.

If *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.

#### `[traceback.print_exc]traceback.print_exc([limit[, file[, chain]]])`

Это сокращение для

`print_exception(*sys.exc_info())`

.

#### `[traceback.print_last]traceback.print_last([limit[, file[, chain]]])`

Это краткая форма для

`print_exception(sys.last_type, sys.last_value, sys.last_traceback, limit, file)`

.

#### `[traceback.print_stack]traceback.print_stack([f[, limit[, file]]])`

Эта функция выводит стековую трассировку начиная с точки вызова. Необязательный аргумент

*f*

позволяет указать альтернативный стековый кадр для начала. Необязательные аргументы

*limit*

и

*file*

имеют тот же смысл, что и для

[`print_exception()`](https://python-all.ru/3.0/library/traceback.html#traceback.print_exception)

.

#### `[traceback.extract_tb]traceback.extract_tb(traceback[, limit])`

Возвращает список не более

*limit*

«предварительно обработанных» записей трассировки стека, извлеченных из объекта трассировки

*traceback*

. Полезно для альтернативного форматирования трассировок стека. Если

*limit*

опущен или

`None`

, извлекаются все записи. «Предварительно обработанная» запись трассировки стека – это четверка (

*filename*

,

*номер строки*

,

*имя функции*

,

*text*

), представляющая информацию, которая обычно выводится для трассировки стека.

*text*

– это строка с удаленными начальными и конечными пробелами; если исходный код недоступен, значением будет

`None`

.

#### `[traceback.extract_stack]traceback.extract_stack([f[, limit]])`

Извлекает «сырую» трассировку из текущего стекового кадра. Возвращаемое значение имеет тот же формат, что и для

[`extract_tb()`](https://python-all.ru/3.0/library/traceback.html#traceback.extract_tb)

. Необязательные аргументы

*f*

и

*limit*

имеют тот же смысл, что и для

[`print_stack()`](https://python-all.ru/3.0/library/traceback.html#traceback.print_stack)

.

#### `[traceback.format_list]traceback.format_list(list)`

По списку кортежей, возвращённому

[`extract_tb()`](https://python-all.ru/3.0/library/traceback.html#traceback.extract_tb)

или

[`extract_stack()`](https://python-all.ru/3.0/library/traceback.html#traceback.extract_stack)

, возвращает список строк, готовых к печати. Каждая строка в результирующем списке соответствует элементу с тем же индексом в исходном списке. Каждая строка заканчивается символом новой строки; строки могут также содержать внутренние символы новой строки для тех элементов, у которых текст исходной строки не равен

`None`

.

#### `[traceback.format_exception_only]traceback.format_exception_only(type, value)`

Форматирует часть трассировки, относящуюся к исключению. Аргументы – это tип исключения и его значение, например, из

`sys.last_type`

и

`sys.last_value`

. Возвращаемое значение – список строк, каждая заканчивается символом новой строки. Обычно список содержит одну строку; однако для исключений

[`SyntaxError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.SyntaxError)

он содержит несколько строк, которые (при печати) отображают подробную информацию о том, где произошла синтаксическая ошибка. Сообщение, указывающее, какое именно исключение произошло, всегда является последней строкой в списке.

#### `[traceback.format_exception]traceback.format_exception(type, value, tb[, limit[, chain]])`

Форматирует стековую трассировку и информацию об исключении. Аргументы имеют тот же смысл, что и соответствующие аргументы

[`print_exception()`](https://python-all.ru/3.0/library/traceback.html#traceback.print_exception)

. Возвращаемое значение – список строк, каждая заканчивается символом новой строки, некоторые содержат внутренние символы новой строки. Если эти строки объединить и вывести на печать, будет напечатан в точности тот же текст, что и при вызове

[`print_exception()`](https://python-all.ru/3.0/library/traceback.html#traceback.print_exception)

.

#### `[traceback.format_exc]traceback.format_exc([limit[, chain]])`

То же, что

`print_exc(limit)`

, но возвращает строку, а не выводит в файл.

#### `[traceback.format_tb]traceback.format_tb(tb[, limit])`

Сокращение для

`format_list(extract_tb(tb, limit))`

.

#### `[traceback.format_stack]traceback.format_stack([f[, limit]])`

Сокращённая запись для

`format_list(extract_stack(f, limit))`

.

## Примеры traceback

Этот простой пример реализует базовый цикл read-eval-print, похожий на стандартный интерактивный цикл интерпретатора Python (но менее полезный). Для более полной реализации цикла интерпретатора обратитесь к модулю [`code`](https://python-all.ru/3.0/library/code.html#module-code).

```python
import sys, traceback

def run_user_code(envdir):
    source = input(">>> ")
    try:
        exec(source, envdir)
    except:
        print("Exception in user code:")
        print("-"*60)
        traceback.print_exc(file=sys.stdout)
        print("-"*60)

envdir = {}
while True:
    run_user_code(envdir)
```

Следующий пример демонстрирует различные способы вывода и форматирования исключения и трассировки:

```python
import sys, traceback

def lumberjack():
    bright_side_of_death()

def bright_side_of_death():
    return tuple()[0]

try:
    lumberjack()
except:
    exceptionType, exceptionValue, exceptionTraceback = sys.exc_info()
    print("*** print_tb:")
    traceback.print_tb(exceptionTraceback, limit=1, file=sys.stdout)
    print("*** print_exception:")
    traceback.print_exception(exceptionType, exceptionValue, exceptionTraceback,
                              limit=2, file=sys.stdout)
    print("*** print_exc:")
    traceback.print_exc()
    print("*** format_exc, first and last line:")
    formatted_lines = traceback.format_exc().splitlines()
    print(formatted_lines[0])
    print(formatted_lines[-1])
    print("*** format_exception:")
    print(repr(traceback.format_exception(exceptionType, exceptionValue,
                                          exceptionTraceback)))
    print("*** extract_tb:")
    print(repr(traceback.extract_tb(exceptionTraceback)))
    print("*** format_tb:")
    print(repr(traceback.format_tb(exceptionTraceback)))
    print("*** tb_lineno:", traceback.tb_lineno(exceptionTraceback))
print("*** print_last:")
traceback.print_last()
```

Вывод для примера будет выглядеть примерно так:

```python
*** print_tb:
  File "<doctest>", line 9, in <module>
    lumberjack()
*** print_exception:
Traceback (most recent call last):
  File "<doctest>", line 9, in <module>
    lumberjack()
  File "<doctest>", line 3, in lumberjack
    bright_side_of_death()
IndexError: tuple index out of range
*** print_exc:
Traceback (most recent call last):
  File "<doctest>", line 9, in <module>
    lumberjack()
  File "<doctest>", line 3, in lumberjack
    bright_side_of_death()
IndexError: tuple index out of range
*** format_exc, first and last line:
Traceback (most recent call last):
IndexError: tuple index out of range
*** format_exception:
['Traceback (most recent call last):\n',
 '  File "<doctest>", line 9, in <module>\n    lumberjack()\n',
 '  File "<doctest>", line 3, in lumberjack\n    bright_side_of_death()\n',
 '  File "<doctest>", line 6, in bright_side_of_death\n    return tuple()[0]\n',
 'IndexError: tuple index out of range\n']
*** extract_tb:
[('<doctest>', 9, '<module>', 'lumberjack()'),
 ('<doctest>', 3, 'lumberjack', 'bright_side_of_death()'),
 ('<doctest>', 6, 'bright_side_of_death', 'return tuple()[0]')]
*** format_tb:
['  File "<doctest>", line 9, in <module>\n    lumberjack()\n',
 '  File "<doctest>", line 3, in lumberjack\n    bright_side_of_death()\n',
 '  File "<doctest>", line 6, in bright_side_of_death\n    return tuple()[0]\n']
*** tb_lineno: 2
*** print_last:
Traceback (most recent call last):
  File "<doctest>", line 9, in <module>
    lumberjack()
  File "<doctest>", line 3, in lumberjack
    bright_side_of_death()
IndexError: tuple index out of range
```

Следующий пример показывает различные способы вывода и форматирования стека:

```python
>>> import traceback
>>> def another_function():
...     lumberstack()
...
>>> def lumberstack():
...     traceback.print_stack()
...     print(repr(traceback.extract_stack()))
...     print(repr(traceback.format_stack()))
...
>>> another_function()
  File "<doctest>", line 10, in <module>
    another_function()
  File "<doctest>", line 3, in another_function
    lumberstack()
  File "<doctest>", line 6, in lumberstack
    traceback.print_stack()
[('<doctest>', 10, '<module>', 'another_function()'),
 ('<doctest>', 3, 'another_function', 'lumberstack()'),
 ('<doctest>', 7, 'lumberstack', 'print(repr(traceback.extract_stack()))')]
['  File "<doctest>", line 10, in <module>\n    another_function()\n',
 '  File "<doctest>", line 3, in another_function\n    lumberstack()\n',
 '  File "<doctest>", line 8, in lumberstack\n    print(repr(traceback.format_stack()))\n']
```

Этот последний пример демонстрирует несколько последних функций форматирования:

```python
>>> import traceback
>>> format_list([('spam.py', 3, '<module>', 'spam.eggs()'),
...              ('eggs.py', 42, 'eggs', 'return "bacon"')])
['  File "spam.py", line 3, in <module>\n    spam.eggs()\n',
 '  File "eggs.py", line 42, in eggs\n    return "bacon"\n']
>>> theError = IndexError('tuple indx out of range')
>>> traceback.format_exception_only(type(theError), theError)
['IndexError: tuple index out of range\n']
```
