В разделе рассмотрены функции модуля traceback
, предназначенные для вывода информации об исключениях и записей трассировки стека на печать или в файл.
traceback.print_tb()
-печать трассировки стека,traceback.print_exception()
- печать исключения и трассировку стека,traceback.print_exc()
- сокращение для вызова traceback.print_exception()
,traceback.print_last()
- еще одно сокращение для вызова print_exception()
,traceback.print_stack()
- печатает записи трассировки, начиная с точки вызова,traceback.format_exc()
- похожа на traceback.print_exc(limit)
но возвращает строку вместо печати,traceback.print_tb(tb, limit=None, file=None)
:Функция traceback.print_tb()
если аргумент limit
положительный, то печатает записи трассировки стека из объекта трассировки tb
, ограничивая количество записей значением limit
(начиная с кадра вызывающего абонента). В противном случае выводит последние записи abs(limit)
.
limit
опущен или отсутствует, то печатаются все записи. file
опущен или отсутствует, то вывод идет в sys.stderr
. file
задан, то для получения вывода он должен быть открытым файлом или файлоподобным объектом.traceback.print_exception(etype, value, tb, limit=None, file=None, chain=True)
:Функция traceback.print_exception()
выводит информацию об исключении и записи трассировки стека из объекта трассировки tb
в файл.
Поведение traceback.print_exception()
отличается от traceback.print_tb()
следующим образом:
tb
не равно None
, то выводится заголовок Traceback (most recent call last):
,etype
исключения и значение после трассировки стека,type(value)
- это SyntaxError
, а значение имеет соответствующий формат, то функция печатает строку, в которой произошла синтаксическая ошибка с символом вставки, указывающим приблизительное положение ошибки.Необязательный аргумент limit
имеет то же значение, что и в функции traceback.print_tb()
.
Если аргумент chain=True
(по умолчанию), то связанные исключения (атрибуты исключения __cause__
или __context__
) также будут выведены, как это делает сам интерпретатор при печати необработанного исключения.
traceback.print_exc(limit=None, file=None, chain=True)
:Функция traceback.print_exc()
представляет собой сокращенное название для вызова traceback.print_exception()
и вызывается с параметрами:
traceback.print_exception(*sys.exc_info(), limit, file, chain)
Обратите внимание, что значение аргументов etype
, value
и tb
функции traceback.print_exception()
уже подставлены в виде вызова sys.exc_info()
.
traceback.print_last(limit=None, file=None, chain=True)
:Функция traceback.print_last()
представляет собой сокращенный для вызова traceback.print_exception()
и вызывается с параметрами:
traceback.print_exception(sys.last_type, sys.last_value, sys.last_traceback, limit, file, chain)
Как правило, функция будет работать только после того, как исключение достигнет интерактивной подсказки (подробнее смотрите описание sys.last_type
).
Обратите внимание, что значение аргументов etype
, value
и tb
функции traceback.print_exception()
уже подставлены в виде значений sys.last_type
, sys.last_value
и sys.last_traceback
соответственно.
traceback.print_stack(f=None, limit=None, file=None)
:Функция traceback.print_stack()
если limit
является положительным, то печатает записи трассировки стека, начиная с точки вызова, ограничивая количество значением limit
. В противном случае выводит на печать последние записи abs(limit)
.
limit
опущен или отсутствует, то печатаются все записи. f
можно использовать для указания альтернативного кадра стека для запуска. file
имеет то же значение, что и для функции traceback.print_tb()
.traceback.format_exc(limit=None, chain=True)
:Функция traceback.format_exc()
похожа на traceback.print_exc(limit)
но возвращает строку вместо печати или сохранения в файл.
Пример наглядно демонстрирует различные способы печати исключения и обратной трассировки:
# test.py import sys, traceback def lumberjack(): bright_side_of_death() def bright_side_of_death(): return tuple()[0] try: lumberjack() except IndexError: exc_type, exc_value, exc_traceback = sys.exc_info() print("*** print_tb:") traceback.print_tb(exc_traceback, limit=1, file=sys.stdout) print("*** print_exception:") # exc_type below is ignored on 3.5 and later traceback.print_exception(exc_type, exc_value, exc_traceback, limit=2, file=sys.stdout) print("*** print_exc:") traceback.print_exc(limit=2, file=sys.stdout) print("*** format_exc, first and last line:") formatted_lines = traceback.format_exc().splitlines() print(formatted_lines[0]) print(formatted_lines[-1])
Результаты вывода:
$ python3 test.py *** print_tb: File "<test...>", line 10, in <module> lumberjack() *** print_exception: Traceback (most recent call last): File "<test...>", line 10, in <module> lumberjack() File "<test...>", line 4, in lumberjack bright_side_of_death() IndexError: tuple index out of range *** print_exc: Traceback (most recent call last): File "<test...>", line 10, in <module> lumberjack() File "<test...>", line 4, 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 ``