    Если функция Power возбуждает исключительную ситуацию, присваивание 
переменной result и следующий оператор вывода пропускаются, а блок try 
немедленно завершается. Оператор catch следует сразу же за блоком try: 

    catch (Errors e) {	
       e.Report(); 
       return -1; } 
    return 0; 

    Если функция Power возбуждает исключительную ситуацию, объект е класса 
Error перехватывается по ссылке. В операторе catch вызывается функция-член 
Report класса Error для объекта исключительной ситуации е, отображающая 
значения, приведшие к ненормальному завершению функции Power. 

    ЗАМЕЧАНИЕ 

    Хотя вы можете посылать  и перехватывать объекты по значению, использование 
ссылок, коды (когда?) посылаются объекты классов, обычно дает лучшие результаты, 
поскольку экономится пространство стека. Этот прием также упрощает 
используемые классы, так как отпадает необходимость в конструкторах копии, 
особенно, если они к тому же выделяют память. 

    Итак, программа осуществляет полный контроль над исключительными 
ситуациями. Пример заканчивает работу с кодом завершения -1, если были ошибки, 
или 0, если ошибок не было. Это обычная практика для программ, хотя 
операционные системы DOS и Windows игнорируют возвращаемые программами значения. 
    Бывают случаи, когда завершение программы нежелательно и возникает 
необходимость повторить операторы, приведшие к исключительной ситуации, — в 
данном случае, указав для new новые значения. Далее в этой главе я объясню, 
как использовать исключительные ситуации в этом случае, но сначала вы должны 
узнать об альтернативных формах объявления функций, возбуждающих 
исключительные ситуации. 

    Объявления исключительных ситуаций 

    С помощью альтернативной формы объявления функции вы можете задавать типы 
исключительных ситуаций, которые разрешается возбуждать в данной функции. Эта 
форма особенно важна для библиотек функций, в которых должны быть обработаны 
все возможные состояния ошибок. Например, функция AnyFunctionO может задать 
типы своих исключительных ситуаций следующим образом: 

    void AnyFunction() throw(Error); 

    Следующее за именем функции и списком параметров (пустым в данном случае) 
выражение throw() указывает, что функция AnyFunctionO может возбуждать 
исключительные ситуации типа Error. Подобное объявление указывает компилятору, 
что функции AnyFunctionO не разрешается возбуждать исключительные ситуации 
других типов. Если вы обнаружили функцию, объявленную таким способом, вам не 
придется охотиться за операторами throw в теле функции для того, чтобы найти 
все возможные типы исключительных ситуаций. Объявление говорит вам о том, что 
функция AnyFunctionO возбуждает исключительную ситуацию типа класса Error. 
    Для задания функции, возбуждающей исключительные ситуации нескольких 
типов, следует перечислить типы данных объектов исключительных ситуаций, 
отделенные друг от друга запятыми в круглых скобках: 

    void AnyFunction() throw(Error, char*, OtherType); 


    Написание обработчиков исключительных ситуаций 

    В предыдущем листинге EXCEPT. CPP обрабатываются все возможные 
исключительные ситуации, однако при обнаружении ошибки программа завершается. 
Несомненно, будет лучше, если операторы, вызвавшие исключительную ситуацию в 
программе, будут повторяться, чтобы пользователь мог ввести корректные 
значения. В следующей модифицированной программе также демонстрируется, как 
писать код, обрабатывающий все возможные исключительные ситуации, даже те, 
которые не ожидались вовсе, возбуждаемые плохо документированными 
библиотечными функциями. Скомпилируйте и запустите листинг 15.17, как вы это 
уже делали с предыдущим листингом (из DOS или в виде EasyWin-приложения). 
Введите неверные значения в ответ на запросы программы. На рис. 15.1 
демонстрируется результат работы программы. 


    Глава 15. Передовые средства C++     407 
