Traceback.print exc: примеры (PYTHON)

Использование функции print_exc для вывода исключений в Python
Раздел: Обработка исключений, Отладка
traceback.print_exc(limit: int, file: file object): None

Описание функции traceback.print_exc

Функция traceback.print_exc является частью модуля traceback в Python и предназначена для форматирования и вывода информации о последнем обработанном исключении. Часто она применяется в блоках except для логирования ошибок без прерывания работы программы.

Основное назначение функции - вывод трассировки стека исключения в стандартный поток ошибок (sys.stderr) или другой указанный файловый объект. Функция извлекает информацию о текущем исключении через sys.exc_info().

Аргументы функции:

  • limit (необязательный) - целое число, ограничивающее количество выводимых уровней стека. Если значение None, выводятся все уровни.
  • file (необязательный) - файловый объект для вывода. По умолчанию используется sys.stderr. Если значение None, вывод происходит в sys.stderr.
  • chain (необязательный, Python 3+) - булево значение, управляющее выводом цепочки исключений. Если True, выводятся все исключения в цепочке (причинные исключения). Значение по умолчанию - True.

Функция не возвращает значений (None).

Простые примеры использования

Базовый пример:

import traceback
try:
    1 / 0
except:
    traceback.print_exc()
Traceback (most recent call last):
  File \"\", line 2, in 
ZeroDivisionError: division by zero

С ограничением глубины стека:

import traceback
def a():
    b()
def b():
    raise ValueError(\"ошибка\")
try:
    a()
except:
    traceback.print_exc(limit=1)
Traceback (most recent call last):
  File \"\", line 7, in 
ValueError: ошибка

Вывод в файл:

import traceback
with open(\"error.log\", \"a\") as f:
    try:
        int(\"не число\")
    except:
        traceback.print_exc(file=f)
# Содержимое файла error.log:
# Traceback (most recent call last):
#   File \"\", line 4, in 
# ValueError: invalid literal for int() with base 10: 'не число'

Похожие функции в Python

traceback.format_exc() - возвращает строку с трассировкой вместо вывода. Удобна для логирования в переменные или отправки по сети.

import traceback
try:
    raise KeyError
except:
    error_msg = traceback.format_exc()
print(\"Сохранённая ошибка:\", error_msg)

traceback.print_exception() - требует явной передачи информации об исключении через sys.exc_info(). Более гибкая, но менее удобная для простых случаев.

logging.exception() - функция модуля logging, автоматически добавляет трассировку стека к сообщению об ошибке. Рекомендуется для логирования в приложениях.

import logging
try:
    {}[\"key\"]
except:
    logging.exception(\"Произошла ошибка\")

Аналоги в других языках

JavaScript: вывод стека через свойство stack объекта ошибки.

try {
    throw new Error(\"ошибка\");
} catch(e) {
    console.error(e.stack);
}

Java: метод printStackTrace() класса Throwable.

try {
    throw new Exception(\"ошибка\");
} catch(Exception e) {
    e.printStackTrace();
}

PHP: использование getTraceAsString().

try {
    throw new Exception(\"ошибка\");
} catch(Exception $e) {
    echo $e->getTraceAsString();
}

Golang: вывод через debug.Stack().

import \"runtime/debug\"
func main() {
    defer func() {
        if r := recover(); r != nil {
            debug.PrintStack()
        }
    }()
    panic(\"ошибка\")
}

Типичные ошибки

Использование вне блока except: функция не выводит информацию, если нет активного исключения.

import traceback
traceback.print_exc()  # Нет активного исключения
# Вывод отсутствует или содержит None

Перепутан порядок аргументов: аргументы должны передаваться по порядку или по ключу.

import traceback
try:
    1/0
except:
    traceback.print_exc(\"output.txt\")  # Ошибка типа
TypeError: print_exc() takes from 0 to 3 positional arguments but 1 was given

Некорректный файловый объект: объект должен иметь метод write.

import traceback
try:
    raise Exception
except:
    traceback.print_exc(file=\"строка\")  # Ошибка

История изменений

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

В Python 3.5 появился параметр chain, управляющий выводом цепочек исключений. По умолчанию имеет значение True.

Наиболее существенные изменения в работе функции связаны с развитием механизма цепочек исключений (PEP 3134).

Расширенные примеры

Кастомизация вывода с перенаправлением:

import traceback, io
try:
    import nonexistent_module
except:
    buffer = io.StringIO()
    traceback.print_exc(file=buffer)
    result = buffer.getvalue()
    print(\"Трассировка в переменной:\", len(result), \"символов\")

Использование с подавлением цепочки исключений:

import traceback
try:
    try:
        1 / 0
    except ZeroDivisionError as e:
        raise ValueError(\"Новое исключение\") from e
except:
    traceback.print_exc(chain=False)  # Без исходной причины

Логирование с фильтрацией уровней стека:

import traceback, sys
def deep_error():
    return 1 / 0
def middleware():
    return deep_error()
def api_call():
    return middleware()
try:
    api_call()
except:
    # Показываем только 3 верхних уровня
    traceback.print_exc(limit=3, file=sys.stdout)

Интеграция с контекстными менеджерами:

import traceback
class ErrorLogger:
    def __enter__(self):
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_type:
            traceback.print_exc()
            return True  # Подавляем исключение
with ErrorLogger():
    raise RuntimeError(\"Ошибка в контексте\")
print(\"Программа продолжает работу\")

питон traceback.print_exc function comments

En
Traceback.print exc Print exception traceback