R Справочное руководство по С++

R.15.2 Запуск особой ситуации.

   


Назад  |  Вперёд

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

           throw "Help!";

может быть перехвачено некоторым обработчиком с типом char*:

           try {
             // ...
           }
           catch(const char* p) {
            // здесь обрабатывается особая ситуация в символьных строках
           }

а особая ситуация Overflow (переполнение):

           class Overflow {
             // ...
           public:
             Overflow(char,double,double);
           };

           void f(double x)
           {
             // ...
             throw Overflow('+',x,3.45e107);
           }

может быть перехвачена обработчиком

           try {
                 // ...
                 f(1.2);
                 // ...
           }
           catch(Overflow& oo) {
                 // здесь обработка особой ситуации типа Overflow
           }

При запуске особой ситуации управление передается ближайшему обработчику соответствующего типа. "Ближайший" - это обработчик, проверяемый-блок которого последним получил управление и оно еще не было передано оттуда. Что такое "соответствующий" тип определяется в $$R.15.4.

При выполнении выражения-запуска создается временный объект статического типа, который служит операндом в команде throw, Этот объект используется для инициализации переменной, соответствующего типа, описанной в обработчике. Если не считать ограничений на сопоставление типов (см. $$R.15.4) и использование временной переменной, то операнд throw аналогичен параметру функции при вызове ($$R.5.2.2) или операнду в операторе return.

Если можно было бы, не меняя смысла программы за счет отказа от вызовов конструкторов и деструкторов для временного объекта ($$R.12.1), обойтись совсем без временного объекта, то особую ситуацию можно было бы непосредственно инициализировать в обработчике параметром выражения запуска.

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

           try {
             // ...
           }
           catch (...) { // перехват всех особых ситуаций
            //  (частичная) обработка особых ситуаций
           throw; // передача остальных особых ситуаций другому обработчику

           }

Назад  |  Вперёд


OtDiatlovaOU
К началу книги

Оформление и дизайн книги OtDiatlovaOU.
Вся книга, архив.