312_____________________________________________Глава 4

При несомненных достоинствах рассмотренного подхода у него есть ряд недо-
статков. Основной из них — увеличение размера вашей программы (особенно, если
она проводит много сложных вычислений) за счет многочисленных операторов
проверки и замедление ее работы. К тому же при использовании библиотечных
функций и процедур, реализация которых неизвестна, не всегда можно быть уве-
ренным, что ваши проверки гарантируют их бессбойную работу.

4.9.2.2 Защита кода зачистки — блоки try ... _finally

Второй способ борьбы с исключениями — использование блока try ... _final-
ly. Блок, содержащий совокупность операторов, способных привести к исключе-
нию, можно оформить следующим образом:

try

f

операторы, способные привести к исключению
)

_finally
{

операторы, выполняемые в любом случае
}

В этом случае операторы в разделе _finally будут выполняться всегда, неза-
висимо от того, было или не было исключение. Если было исключение, то после
выполнения этих операторов вычисления, как и ранее, прерываются и возникает
сообщение об исключении; в противном случае управление передается операторам,
следующим за разделом _finally.

В качестве примера рассмотрим приведенный ранее фрагмент кода с времен-
ным файлом и динамическим распределением памяти, оформленный следующим
образом:

FILE *fp;

int size;

char *str;

try

{

fp = fopen("a.tmp", "w");

fprintf(fp,"файл a.tmp");

str = (char *) malloc(size);

// операторы, в которых может обнаружиться
// исключительная ситуация
)

finally
(

remove("а.tmp");

free(str) ;

)

В этом случае процедуры remove и free будут выполнены независимо от того,
сгенерировано ли исключение в операторах блока try, или все вычисления в них
закончились благополучно. Таким образом проблема зачистки «мусора» снимает-
ся — память в любом случае будет освобождена, а временный файл будет удален.
Причем, это достигается ничтожным дополнительным кодом по сравнению с гло-
бальной предварительной проверкой всех операций.

К сожалению, остаются другие из рассмотренных проблем: необходимость
принять какие-то меры для дальнейшей нормальной работы программы при гене-
рации исключения, а также необходимость уведомить пользователя о желатель-
ных действиях с его стороны (сообщения типа приведенных на рис. 4.26 в этом
случае отображаются на экране, но они мало информативны для пользователя).
Решить эти проблемы в данном случае невозможно, поскольку при выполнении