В C++, если есть активное исключение, то повторное возникновение исключения приводит к завершению программы.

Исключение может быть активным или неактивным при вызове деструктора. К сожалению, внутри деструктора невозможно различить эти условия. В результате вы должны писать свои деструкторы с консервативным предположением, что исключение активно, потому что, если управление покидает деструктор из-за исключения, в то время как активно другое исключение, C++ вызывает функцию завершения.

Session::~Session()
{
    logDestruction(this);
}

Это выглядит хорошо, но подумайте, что произойдет, если logDestruction выдаст исключение. Исключение не будет перехвачено в деструкторе Session, поэтому оно будет передано вызывающему объекту этого деструктора. Но если бы сам деструктор был вызван из-за того, что было выброшено какое-то другое исключение, функция завершения была бы вызвана автоматически, и это остановило бы вашу программу в тупике.

Вам нужно будет предотвратить распространение исключения, вызванного logDestruction, за пределы деструктора Session. Единственный способ сделать это — использовать блоки try и catch. Наивная попытка может выглядеть так,

Session::~Session()
{
 try {
     logDestruction(this);
 }
 catch (…) {
     cerr << “Unable to log destruction of Session object “
     << “at address “
     << this
     << “.\n”;
 }
}

но это, вероятно, не безопаснее, чем наш исходный код. Если один из вызовов operator‹‹ в блоке catch приводит к возникновению исключения, мы возвращаемся к тому, с чего начали, с исключением, покидающим деструктор Session.

Session::~Session()
{
 try {
     logDestruction(this);
 }
 catch (…) { }
}

Кажется, что блок catch ничего не делает, но внешность может быть обманчивой. Этот блок предотвращает распространение исключений, созданных из logDestruction, за пределы деструктора Session. Это все, что нужно сделать. Теперь мы можем быть спокойны, зная, что если объект Session будет уничтожен как часть раскручивания стека, метод terminate не будет вызываться.

Источник: Более эффективный C++