Модуль 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']