traceback — Печать и извлечение стека вызовов
Модуль traceback предоставляет доступ к интерфейсу извлечения, форматирования и печати "стека вызовов" (traceback) вашей программы. Он имитирует классическое поведение красного текста ошибки интерпретатора Python.
Это абсолютно необходимо для продакшен-кода: если вы просто отлавливаете ошибки через try...except, вы теряете информацию о том, НА КАКОЙ СТРОКЕ и В КАКОЙ ФУНКЦИИ она произошла. traceback это решает.
import traceback
Печать ошибки без падения (Краша)
Обычно, если отловить ошибку, программа не падает, но мы не знаем, откуда она пришла:
import traceback
def calculate():
return 100 / 0
try:
calculate()
except Exception as e:
print("Упс, произошла ошибка! Но сервер не упал.")
# Функция e печатает просто: "division by zero" - неинформативно.
# Печатает полный классический красный лог в консоль:
# File "myscript.py", line 4, in calculate
traceback.print_exc()
print("Программа продолжает работать как ни в чем не бывало!")
Сохранение ошибки (Traceback) в строку
Если вы хотите не просто вывести текст в консоль, а сохранить ошибку в базу данных, отправить её разработчику в Telegram или записать в чистый лог-файл, нужно извлечь её как текст.
import traceback
try:
calculate()
except Exception as e:
# Извлечь полную простыню текста ошибки в классную строку
error_string = traceback.format_exc()
with open('critical_errors.log', 'a', encoding='utf-8') as f:
f.write("ПРОИЗОШЛА КРИТИЧЕСКАЯ ОШИБКА:\n")
f.write(error_string)
Полный справочник API (API Reference)
Главные функции
| Функция | Описание |
|---|---|
traceback.print_exc(limit=None, file=None) |
Автоматически захватывает текущее активное исключение (доступно только внутри блока except) и печатает его структуру (Traceback) в консоль ошибок (или в переданный файл file). limit позволяет обрезать стек глубже N шагов. |
traceback.format_exc(limit=None) |
Работает точно как print_exc(), но никуда ничего не печатает, а ПРОСТО возвращает всю многострочную структуру об ошибке в виде типа str (строки). Идеально для логирования. |
traceback.print_stack(f=None, limit=None) |
Выводит стек ВЫЗОВОВ ТЕКУЩЕГО КОДА, даже если ошибки не было! Крайне полезно для дебага сложных вызовов, когда вы хотите понять "как вообще код дошел до вызова этой функции?". |
traceback.format_stack() |
Возвращает информацию из print_stack() в виде списка строк для дальнейшего анализа. |
traceback.extract_tb(tb, limit=None) |
Извлекает из объекта traceback подробные метрики (номер строки, имя файла, имя модуля, локальные переменные) для глубокого ООП-анализа ошибки. |