Естественно, что исключения нарушает нормальный ход программы и к этому надо быть готовым заранее. Главный принцип это обрабатывать исключения локально. Смотрите пример.
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;
Да, напоследок механизм исключений автоматически уничтожает оконные объекты. Это где-то в книге мне попадалось только не помню в какой.