    Вот три важных следствия из приведенного примера. 

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

    Последнее замечание — ключевое. Функция AnyFunctionO обычно возвращает 
целочисленное значение, однако, если возникает исключительная ситуация, она 
возвращает строку или объект класса Overflow. Только операторы catch могут 
воспринять эти возвращаемые значения. Если исключительных ситуаций не 
возникло, функция завершается нормально, возвращая (необязательно) значение 
типа, с которым объявляется функция, обратно оператору вызова этой функции. 
    Вы можете поддерживать несколько типов объектов исключительных ситуаций с 
помощью серии операторов catch. Например, для обработки исключительных 
ситуаций для класса Error и строк напишите следующие операторы catch один за другим: 

    catch (Error e) { 
        // Обработка исключительной ситуации для класса Error 
    }
    catch (const char* message) { 
       /./ Обработка исключительной ситуации для строк 1 
     }


    Введение в блоки try 

    Теперь настало время для изучения еще одной премудрости — блоков try, 
которые, кажется, смущают любого, кто только начал ими пользоваться. Для того 
чтобы принимать объекты исключительных ситуаций некоторой функции, вызовите ее 
внутри блока try: 

    try { 
       int x = AnyFunction();	// Вызвать функцию 
    } 
    catch (Error e)  {              // Если функция возбудила исключительную ситуацию 
       e.Report();	// вызвать функцию Report объекта Error 
       exit(-1);                  //и прервать выполнение программы 

    Блок try содержит один или несколько операторов, исключительные ситуации 
которых вы хотите перехватывать. Один или более операторов catch должны 
следовать за блоком try. Это похоже на ситуацию, когда игрок разбегается, 
чтобы пробить пенальти, а вратарь готовится отразить удар. В любом случае, 
после блока try следует поместить один или несколько операторов catch, 
перехватывающих все исключительные ситуации, возбуждаемые этими операторами. 
    Несколько блоков try и соответствующих им операторов catch могут быть 
объявлены вложенными, хотя синтаксис в этом случае может привести к 
запутанному коду. Например, блок try может иметь вложенные блок try и 
операторы catch в следующем гипотетическом примере, причем, если в функции 
FunctionА() возбуждается исключительная ситуация, программа полностью 
пропускает вложенный блок try: 

    try { 
    FunctionA();     // Испытать эту функцию во внешнем блоке 
       try {         // Вложенный блок try, пропускается в случае 
                      // исключительной ситуации
            FunctionB();  // Испытать эту функцию во внутреннем блоке 
       } 
       catch (Error e) {   // Перехватить исключительную ситуацию, возбуждаемую 
                                     // функцией FunctionB()
           e.Report();       // Вызвать функцию объекта исключительной ситуации 
                                    // Report {) 
       } 
    } 
    catch (Error e) {   // Перехватить исключительную ситуацию, возбуждаемую 
                                  // функцией FunctionA()
       e.Report();        // Вызвать функцию объекта исключительной ситуации 
                                 // Report() 
    }
 

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