Мне видится, что было бы полезно внести следующие изменения в механизм исключений C++.
Во-первых, добавить новый оператор error.
throw Type(args);
error Type(args);
В отличии от оператора throw, error не прерывает исполнения, а сигнализирует об ошибке.
Блок try/catch должен быть устроен так
try(CatchType obj)
{
....
error "error 1";
....
throw "error 2";
....
}
При этом CatchType имеет следующий интерфейс:
class TryCatch
{
....
public:
void operator () (const char *str); // для типа const char *
void operator () (std::exception ex); // для типа std::exception
....
void operator () (); // для оставшихся типов
};
Т.е. блок try конструирует объект-ловушку и для обработки исключений вызываются методы этого объекта.
При этом может случится несколько вызовов, если в процессе исполнения тела блока был вызван error.
В процессе свёртки стека деструкторы классов принудительно "останавливают" исключения.
Т.е. если в деструкторе произошло исключение, то управление передаётся не на конец try блока, а на конец деструктора.
Тем самым снимается проблема исключений в деструкторах.