Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Козак Н.В. Лекции Основы создания программ в Си...doc
Скачиваний:
24
Добавлен:
23.09.2019
Размер:
2.24 Mб
Скачать

Перехват всех исключений

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

void manipulation()

{

resource res;

res.lock(); // захват ресурса

// использование ресурса

// действие, в результате которого возбуждено исключение

res.release(); // не выполняется, если возбуждено исключение

}

Если исключение возбуждено, то управление не попадет на инструкцию, где ресурс освобождается. Чтобы освободить ресурс, не пытаясь перехватить все возможные исключения (тем более, что мы не всегда знаем, какие именно исключения могут возникнуть), воспользуемся специальной конструкцией, позволяющей перехватывать любые исключения. Это не что иное, как предложение catch, в котором объявление исключения имеет вид (...) и куда управление попадает при любом исключении. Например:

Обычно конструкция catch(...) используется в сочетании с повторным возбуждением исключения.

void manipulation ()

{

resource res;

res.lock();

try

{

// использование ресурса

// действие, в результате которого возбуждено исключение

}

catch (...)

{

res.release();

throw;

}

res.release(); // не выполняется, если возбуждено исключение

}

Предложение catch(...) используется самостоятельно или в сочетании с другими catch- обработчиками:

try

{

stack.display();

for ( int ix = 1; ix < 51; ++x )

{

// работа со стеком

}

}

catch ( pushOnFull ) { }

catch ( popOnEmpty ) { }

catch ( ... ) { } // должно быть последним в списке catch-обработчиков