|
|
При запуске особой ситуации управление передается обработчику. Запуск сопровождается передачей объект, тип которого определяет, какой обработчик должен перехватить особую ситуацию. Так, выражение
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; // передача остальных особых ситуаций другому обработчику }
| |