Гарантии безопасности исключений определяют поведение функции в случае возникновения исключения. Выделяют четыре уровня гарантий:
Базовая гарантия (Basic guarantee): Если функция выбрасывает исключение, программа остается в валидном состоянии. Ресурсы не утекают (например, память освобождается), но точное состояние объектов может быть неизвестно. Сохраняется возможность дальше работать с приложением.
c
Строгая гарантия (Strong guarantee): Если функция выбрасывает исключение, состояние программы остается идентичным тому, которое было до вызова функции. Все изменения откатываются.
c
Гарантия отсутствия исключений (No-throw guarantee): Функция гарантированно не выбрасывает исключений. Такие функции помечаются спецификатором noexcept.
c
Гарантия сбоя (Failure guarantee): В контексте безопасности исключений иногда упоминается этот уровень, означающий, что функция может оставить программу в неопределенном состоянии, возможна утечка ресурсов или сбои. Это фактически отсутствие гарантий. Следует избегать такого поведения.
Важность гарантий безопасности исключений заключается в создании надежного и предсказуемого кода, который корректно обрабатывает ошибки и управляет ресурсами даже при возникновении исключений. Выбор уровня гарантии зависит от критичности операции, стоимости отката и вероятности возникновения исключения.
Таблица сравнения гарантий:
| Гарантия | Состояние при исключении | Целостность данных | Утечки ресурсов |
|---|---|---|---|
| Базовая | Валидное, но неопределенное | Не гарантируется | Нет |
| Строгая | Не изменено (как до вызова) | Сохраняется | Нет |
| Отсутствия | Никогда не происходит (нет исключений) | N/A | N/A |
| Сбоя (отсутствие) | Неопределенное, возможно повреждение или сбои | Не гарантируется | Возможно |