R.15.4 Обработка особой ситуации
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).
Особая ситуация считается обработанной после входа в тело обработчика. В этот момент завершится "раскручивание стека".