Traceback.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(\"Программа продолжает работу\")