    Использование исключительных ситуаций 

    Что же представляет собой в точности исключительная ситуация? Ответ прост. 
Исключительные ситуации представляются объектами, которые очень похожи на 
аргументы функции. Это могут быть объекты любого типа, однако наиболее часто 
они представляют собой экземпляры класса. Например, вы можете объявить класс 
Overflow, он не нуждается в каком-либо содержимом, необходимо лишь имя: 

    class Overflow { }; 

    Вы можете послать экземпляр этого класса для возбуждения исключительной 
ситуации (предположим, внутри функции): 

    throw Overflow(); 

    В этом операторе создается объект класса Overflow, который затем 
посылается обратно в место вызова функции. Где-нибудь в другом месте программы 
можно перехватить исключительную ситуацию с помощью оператора catch: 

    catch (Overflow)  { 
        cout « "Overflow detected!" « endl; 
    }	

    Одно только присутствие объекта Overflow свидетельствует о возбуждении 
исключительной ситуации. Объект не обязан предпринимать каких-либо действий 
(хотя может). 
    Важно понять, что предыдущий оператор throw посылает объект класса 
Overflow, который перехватывается оператором catch в другом месте программы 
(пока не думайте о том, где именно). Может быть, эту концепцию легче будет 
понять, если снабдить перехватываемый объект именем, используя синтаксис, 
принятый в объявлениях списков параметров функций: 

    catch (Overflow overObject) { 
       // ... 
     }

    На этот раз объект в операторе catch получил имя overObject. В других 
операторах внутри catch можно использовать объект overObject точно так же, как 
и в операторах, использующих параметр функции. 
    Например, обычно в классе исключительной ситуации реализуются 
функции-члены, которые можно вызывать в выражениях внутри catch. Вот пример:	

    class Overflow { 
       void Report()  { cout « "Error: overflow" « endl; } 
    };

    В классе Overflow объявляется функция-член ReportO, отображающая сообщение 
об ошибке (я использовал встраиваемую функцию исключительно для демонстрации, 
она может быть также и вызываемой функцией-членом). В операторе catch можно 
вызвать Report() объекта исключительной ситуации для отображения сообщения об ошибке: 

    catch (Overflow overObject)	{ 
       overObject.Report();	// Вызвать функцию Report брошенного объекта          
    }                    


    Возбуждение нескольких исключительных ситуаций 

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

    int AnyFunction() 
    { 
       if (conditionA)        // Если выполняется условие condition* 
         throw "Big trouble!";  // послать строковый объект 
      if (conditions)        // Если выполняется условие conditions 
        throw Overflow();     // послать объект класса Overflow 
     return 123;	// Если нет проблем, вернуть значение 
   } 

    Если условие conditionA справедливо (что бы оно ни значило), функция 
возбуждает строковую исключительную ситуацию с сообщением "Big trouble!". Если 
выполняется условие conditionB, функция посылает объект класса Overflow, 
создаваемый в данном случае с помощью обращения к конструктору класса по 
умолчанию. Если же функция не обнаружила ошибок, она возвращается обычным 
образом, передавая значение 123 тому, кто ее вызвал.	


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