    Использование блоков try 

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

    try {	
        cout «"Неге we go!" « endl;	
        int х = AnyFunction();	
       cout «	"x == " « x « endl;	
    }	

    В блоке try сначала отображается сообщение. Затем в нем вызывается функция 
AnyFunction(), результат которой присваивается целочисленной переменной х. Если 
в функции AnyFunction возникла исключительная ситуация, блок try немедленно 
завершается. Другими словами, любое условие исключительной ситуации приводит к 
пропуску присваивания х и завершающего оператора вывода.	

    ЗАМЕЧАНИЕ 

    Особенно важен тот факт, что при возбуждении исключительной «итуацин 
функцией AnyFunction() в предыдущем фрагменте кода, присваивания значения 
целочисленной переменной х не произойдет. 

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

    try { 
       cout « "Неге we go!" « endl, 
       int x = AnyFunction();	
       cout « "x == " « x « endl; 
     }	
     catch (char* message) { 
       cout « "Error1  -- " « message « endl, 
       exit(-1);   // Необязательно 
    catch (Overflow) { 
       cout « "Overflow!" « endl, 
       exit(-2);   // Необязательно 
    } 
   // В этом месте программа продолжает выполнение как обычно 

    В этом более пространном коде сначала испытывается вызов функции 
AnyFunction(). Если функция завершилась нормально, ее результат присваивается 
переменной х, которая отображается в следующем операторе записи в стандартный 
поток вывода. Если исключительных ситуаций не было, оба оператора catch 
пропускаются, поскольку нет объектов исключительных ситуаций объявленных 
типов, которые нужно было бы перехватывать. Конечно, если функция AnyFunction()
возбуждает исключительную ситуацию, выполнение блока try немедленно 
прерывается, посланные объекты перехватываются соответствующими операторами 
catch, a именно тем из них, в котором объявлен параметр типа, соответствующего 
типу данных посланного объекта. 
    В данном примере в операторах catch вызывается библиотечная функция exitO 
для аварийного завершения программы. Приведенная реакция не обязательна — вам 
предоставляется самому решать, что делать в ответ на возбуждение исключительной 
ситуации.	
    Вы можете вставить один, два, три или более операторов catch после блока 
try для обработки исключительных ситуаций различных типов. В этом примере 
два оператора catch обрабатывают исключительные ситуации для строк и класса 
Overflow. Любые другие типы исключительных ситуаций, не обрабатываемые 
операторами catch, передаются вверх по цепочке вызовов. Например, предположим, 
что функция AnyFunction также возбуждает исключительную ситуацию типа 
NewException. Если в функции g() был вызван упомянутый выше код, объект этой 
исключительной ситуации будет передаваться наверх в g(), так как в этом коде 
обрабатываются только исключительные ситуации типов char* и Overflow. 
    В конце концов, если ни один оператор catch подходящего типа не был найден 
в цепочке вызовов, ведущих к исключительной ситуации, выполнение программы 
прерывается вызовом специального обработчика исполняющей системы. Чтобы этого 
не произошло, следует запрограммировать все операторы catch для всех возможных 
типов посылаемых объектов 

   ЗАМЕЧАНИЕ

    Исключительные ситуации упраздняют необходимость резервирования 
специальных возвращаемый-значений для ошибок. Например, в классическом 
программировании на С и C++ для функции, возвращающей целое значение, может 
указываться, что -1 сигнализирует об ошибке, прочие же возвращаемые значения — 
допустимые. В этом приеме нет ничего неправильного, просто резервирование 
специальных значений не 


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