Сообщить об ошибке.

Модуль traceback в Python, трассировки стека

Печать или извлечение обратной трассировки стека

Модуль traceback предоставляет стандартный интерфейс для извлечения, форматирования и вывода на печать трассировок стека программ Python. Модуль точно имитирует поведение интерпретатора Python при печати трассировки стека.

Модуль traceback полезен, когда появляется необходимость распечатать трассировку стека под управлением программы.

Модуль использует объекты трассировки - это тип объекта, который сохраняется в переменной sys.last_traceback и возвращается как третий элемент из sys.exc_info().

Примеры использования модуля traceback:

Этот простой пример реализует базовый цикл read-eval-print, аналогичный стандартному интерактивному интерпретатору Python. Для более полной реализации эмуляции интерпретатора смотрите описание модуля code.

# test.py
import sys, traceback

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

envdir = {}
while True:
    run_user_code(envdir)

Запускаем эмуляцию интерпретатора Python.

$ python3 test.py
>>> a = 3
>>> b = '1'           
>>> a + b
Exception in user code:
------------------------------------------------------------
Traceback (most recent call last):
  File "tt.py", line 6, in run_user_code
    exec(source, envdir)
  File "<string>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
------------------------------------------------------------

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

>>> import traceback
>>> def another_function():
...     lumberstack()
... 
>>> def lumberstack():
...     traceback.print_stack()
...     print(repr(traceback.extract_stack()))
...     print(repr(traceback.format_stack()))
... 
>>> another_function()
#   File "<stdin>", line 1, in <module>
#   File "<stdin>", line 2, in another_function
#   File "<stdin>", line 2, in lumberstack
# [<FrameSummary file <stdin>, line 1 in <module>>, 
# <FrameSummary file <stdin>, line 2 in another_function>, 
# <FrameSummary file <stdin>, line 3 in lumberstack>]
# ['  File "<stdin>", line 1, in <module>\n', '  File "<stdin>", 
# line 2, in another_function\n', '  File "<stdin>", 
# line 4, in lumberstack\n']