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

Вывод трассировки на печать или в файл, модуль traceback в Python

Печать или вывод в файл информации об исключениях и записей трассировки стека

В разделе рассмотрены функции модуля traceback, предназначенные для вывода информации об исключениях и записей трассировки стека на печать или в файл.

Содержание:


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
``