    В больших программах прототипы функций и неполные объявления класса лучше 
всего размещать в 1 нескольких заголовочных файлах я модулях. Но, коиечно, не 
обязательно придерживаться этой конденяин » " небольших демонстрапионных 
модулях, подобных EXCEPlZCPP. 
    Для повторного запроса вводимых значений в функции mainO используется 
"бесконечный" цикл for следующего вида: 

    for (;;) { 
       // ..  повторять это "до бесконечности" 
    } 

    Операторы внутри цикла выполняются до тех пор, пока не попадется return 
или другой оператор, завершающий программу. Это позволяет сохранять в 
программе контроль над всеми возможными способами завершения. 
    Внутри цикла for, в блоке try, за которым следует оператор catch, 
вызывается функция Run(), добавленная для демонстрации. Для перехвата всех 
возможных типов исключительных ситуаций после блока try, вызывающего функцию 
Run(), используется единственный оператор catch с многоточием в круглых скобках: 

    try { 
      Run(); 
      // Любые обычные операторы или return 
    } 
    catch (...)  { 
       // Операторы обработчика любых типов исключительных ситуаций 
    } 

    Если в функции Run() не было исключительных ситуаций, выполняются 
операторы, следующие за вызовом этой функции. Эти операторы могут быть какими 
угодно: например, оператор return для завершения программы или же библиотечная 
функция, подобна exit().	
    Когда используется оператор catch с многоточием в скобках, он может 
обрабатывать любые исключительные ситуации, нигде больше не обрабатываемые. 
Эти исключительные ситуации передаются назад из функции Run() (так как это 
единственная функция, вызванная из main()). Поэтому такой прием гарантирует, 
что никакие исключительные ситуации не прервут выполнение программы с помощью 
выполняемых по умолчанию подпрограмм исполняющей системы. 
    В листинге функция Run() очень похожа на вызывающую ее функцию main(). В 
ней с использованием блока try вызывается функция Pow() (в которой, в свою 
очередь, вызывается Power()) для перехвата любых возникших исключительных 
ситуаций. Конечно, оператор catch слегка отличается: 

    catch (Errors e) 
      e.Report();	// Отобразить сообщение об ошибке 
      throw e;	// Передать исключительную ситуацию обратно в main() 
    } 

    Если функция Power() возбуждает исключительную ситуацию, в операторе catch 
вызывается функция-член Report() для отображения сообщения об ошибке. После 
этого в операторе catch возбуждается еще одна исключительная ситуация. Это 
служит причиной немедленного завершения выполнения функции Run() и передачи 
объекта ошибки назад, в место вызова функции. Универсальный оператор catch (с 
многоточием в круглых скобках) в функции main() принимает это сообщение об 
ошибке, пропуская оператор return, завершающий программу, и заставляет цикл повторяться.	

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

    В предыдущем разделе демонстрировалось, как обработать все возможные 
исключительные ситуации, однако вы можете задуматься: "А что произойдет, если 
возникшая исключительная ситуация нигде не обработается?" Ответ прост и 
логичен. Необработанные исключительные ситуации передаются вверх по цепочке 
вызовов (имеется в виду цепочка вызовов одних функций другими) до тех пор, 
пока не встретится соответствующий им оператор catch или пока больше не 
останется нерассмотренных обработчиков исключительных ситуаций. Если 
произойдет последнее, для обработки исключительной ситуации вызывается одна из 
трех специальных функций, автоматически присоединяемых к каждой программе на 
C++, использующей исключительные ситуации. Эти функции имеют имена 
unexpected(), terminate() и abort(). Они вызываются в соответствии со следующими правилами. 


    410     Часть III. Программирование на ANSI C++ 
