🤔 Что знаешь про гарантии безопасности исключений?



Гарантии безопасности исключений (Exception Safety Guarantees) — это концепция, связанная с корректным поведением программы при возникновении исключений. Она определяет, насколько безопасно может завершиться выполнение функции или блока кода в случае выбрасывания исключения.



🚩Никаких гарантий (No Guarantee)



Этот уровень означает, что при возникновении исключения состояние программы может быть непредсказуемым. Объекты могут остаться в недопустимом состоянии, и поведение программы после выброса исключения неопределено.

void unsafeFunction(std::vector<int>& vec, int value) {

vec.push_back(value); // Если здесь выбросится исключение, состояние vec не определено

// ...

}




🚩Базовая гарантия (Basic Guarantee)



Этот уровень гарантирует, что не произойдёт утечек ресурсов или нарушений инвариантов объектов. После выброса исключения все объекты остаются в допустимом состоянии, однако состояние программы может быть частично изменено.

void safeFunction(std::vector<int>& vec, int value) {

try {

vec.push_back(value); // Если исключение, состояние vec остаётся корректным

} catch (...) {

// Обработка исключения

std::cerr << "Ошибка при добавлении элемента!" << std::endl;

}

}




🚩Сильная гарантия (Strong Guarantee)



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

void addValue(std::vector<int>& vec, int value) {

std::vector<int> temp = vec; // Создаём копию

temp.push_back(value); // Работаем с копией

vec = temp; // Замена содержимого

}




🚩Гарантия отсутствия исключений (No-Throw Guarantee)



Этот уровень гарантирует, что функция никогда не выбрасывает исключений. Обычно применяется к ключевым операциям (например, деструкторам, перемещениям).

void safeSwap(std::vector<int>& a, std::vector<int>& b) noexcept {

a.swap(b); // std::vector::swap гарантирует отсутствие исключений

}




🚩Как достигаются гарантии безопасности исключений?



🟠RAII (Resource Acquisition Is Initialization)

Использование классов, где ресурсы освобождаются в деструкторах. Например, std::unique_ptr или std::lock_guard.



🟠Копирование перед изменением

Применение принципа работы с временными копиями (как в примере сильной гарантии).



🟠Использование стандартных контейнеров

Библиотека STL предоставляет базовую гарантию безопасности исключений для большинства операций.



Ставь 👍 и забирай 📚 Базу знаний