Выброс исключения в конструкторе:
- Если исключение выбрасывается в конструкторе, деструктор объекта не вызывается.
- Необходимо позаботиться об освобождении уже выделенных ресурсов до момента выброса или использовать идиому RAII (Resource Acquisition Is Initialization) для управления ресурсами.
- Частично сконструированный объект находится в неопределенном состоянии.
Выброс исключения в деструкторе:
- Выброс исключения из деструктора в процессе раскрутки стека (stack unwinding) из-за другого исключения приводит к вызову
std::terminate
, которое прерывает выполнение программы. Это очень плохо.
- Деструкторы должны быть
noexcept
.
- Если в деструкторе необходимо выполнить операцию, которая может выбросить исключение (например, закрытие файла), следует обработать это исключение внутри деструктора (например, записать в лог) вместо его дальнейшего распространения.
cpp