Спецификации исключений. В заголовке функции можно задать
список типов исключений, которые она может прямо или косвенно порож-
дать. Этот список приводится в конце заголовка и предваряется ключевым
словом throw: void func(int a) throw (ex_l, ex_2); Такое объявление означает, что функция func может сгенерировать
только исключения ex_l, ex_2 и исключения, являющиеся производными
от этих типов. Заголовок является интерфейсом функции, поэтому такое
объявление дает пользователям функции определенные гарантии. Это
очень важно при использовании библиотечных функций, так как опреде-
ления функций в этом случае не всегда доступны.
Если функция сгенерирует исключение, не соответствующее спе-
цификации исключений, то система вызовет обработчик unexpected(),
который может попытаться сгенерировать свое исключение, и если оно
не будет противоречить спецификации, то продолжится поиск подходя-
щего обработчика, в противном случае вызывается функция terminate(). Вместо функции unexpected() можно установить собственную
функцию, для этого нужно воспользоваться функцией set_unexpected(). Если спецификация исключений задана в виде throw(), это озна-
чает, что функция вообще не генерирует исключений.
Неперехваченные исключения. Если исключение сгенерировано,
но не перехвачено, вызывается стандартная функция terminate(), по умол-
чанию эта функция вызывает функцию abort(). Результатом выполнения
функции abort() будет окно с сообщением об аварийном завершении про-
граммы. Вызов функции abort() можно заменить вызовом своего обработ-
чика с помощью функции set_terminate(). Исключения в конструкторах. Исключения предоставляют един-
ственную возможность передать информацию об ошибке, случившейся
в процессе создания нового объекта.
// реализация методов класса intArr intArr:: intArr (int n)
53
{ size = n; p = new int[n]; // выделение памяти if(!p) throw "error in constructor"; // генерирует исключение при
// ошибке выделения памяти
for(int i=0;i// заполнение вектора нулевыми
// элементами }