Естественно, что исключения нарушает нормальный ход программы и к этому надо быть готовым заранее. Главный принцип это обрабатывать исключения локально. Смотрите пример.
void MyFuct() { CPen *cp=new CPen(255,0,0) // --- код ---- ...... ИСКЛЮЧЕНИЕ ...... // ------------- delete cp; }В данном примере при появлении исключения память выделенная переменной cp не будет освобождена !!!. При вызове исключения обработка будет передана куда-то дальше в обработчик и работа функции не будет завершена. Поэтому при исключении delete не будет вызван. Давайте изменим код ближе к правильному.
void MyFuct() { CPen *cp=new CPen(255,0,0) try { // --- код ---- ...... ИСКЛЮЧЕНИЕ ...... // ------------- } catch(CException* e) { e->Delete(); } delete cp; }Здесь мы вроде как всё предусмотрели. И объект удалили и исключение обработали и удалили. Что делать если исключение Вы не хотите обрабатывать локально ? Вот некоторый выход.
........ catch(CException* e) { delete cp; throw; } delete cp;
Да, напоследок механизм исключений автоматически уничтожает оконные объекты. Это где-то в книге мне попадалось только не помню в какой.