logo
volkov / C++ / Бьерн Страуструп-Справочное руководство по С++

R.15.4 Обработка особой ситуации

Обработчик типа T, const T, T& или const& сопоставим с

выражением-запуска, имеющим операнд типа E, если:

[1] T и E являются одним типом;

[2] T является доступным ($$R.4.6) базовым классом E в точке

запуска;

[3] T является типом указателя, а E является таким типом указателя,

который можно в точке запуска преобразовать в T с помощью

стандартных преобразований указателя ($$R.4.6).

Рассмотрим пример:

class Matherr { /* ... */ virtual vf(); };

class Overflow : public Matherr { /* ... */ };

class Underflow : public Matherr { /* ... */ };

class Zerodivide : public Matherr { /* ... */ };

void f()

{

try {

g();

}

catch (Overflow oo) {

// ...

}

catch (Matherr mm) {

// ...

}

}

Здесь обработчик Overflow будет перехватывать ситуации типа

Overflow, а обработчик Matherr будет перехватывать ситуации типа

Matherr и всех типов, являющихся общими производными от Matherr,

включая Underflow и Zerodivide.

Обработчики в проверяемом-блоке подбираются для данной особой

ситуации в порядке их описания. Считается ошибкой , если обработчик

для базового класса помещен перед обработчиком для производного класса,

поскольку при таком расположении управление никогда не попадет

к обработчику для производного класса.

Эллипсис ... в описании-особой-ситуации действует так же как, и

в описании параметров функции, он сопоставим с любой особой

ситуацией. Если задан эллипсис, то использующий его обработчик

должен идти последним в проверяемом-блоке.

Если в проверяемом-блоке не произошло сопоставления ни с одним

из обработчиков, поиск соответствующего обработчика продолжается

в динамически объемлющем проверяемом-блоке. Если во всей программе

не произошло сопоставления ни с одним обработчиком, вызывается

функция terminate() ($$R.15.7).

Особая ситуация считается обработанной после входа в тело

обработчика. В этот момент завершится "раскручивание стека".