Справочное руководство по C++
Шрифт:
Конструкция проверяемый-блок является оператором (§R.6), а выражение-запуска - унарным выражением типа void (§R.5). Иногда выражение-запуска называют "точкой запуска", а про функцию, в которой встретилось выражение-запуска, говорят, что она "запускает особую ситуацию. Часть программы, которой передается управление из точки запуска называется обработчиком.
R.15.2 Запуск особой ситуации
При запуске особой ситуации управление передается обработчику. Запуск сопровождается передачей объект, тип которого определяет, какой обработчик должен перехватить особую ситуацию. Так, выражение
может быть перехвачено некоторым обработчиком с типом char*:
а особая ситуация Overflow (переполнение):
может быть перехвачена обработчиком
При запуске особой ситуации управление передается ближайшему обработчику соответствующего типа. "Ближайший" - это обработчик, проверяемый-блок которого последним получил управление и оно еще не было передано оттуда. Что такое "соответствующий" тип определяется в §R.15.4.
При выполнении выражения-запуска создается временный объект статического типа, который служит операндом в команде throw, Этот объект используется для инициализации переменной, соответствующего типа, описанной в обработчике. Если не считать ограничений на сопоставление типов (см. §R.15.4) и использование временной переменной, то операнд throw аналогичен параметру функции при вызове (§R.5.2.2) или операнду в операторе return.
Если
Если в выражении-запуска операнд не задан, то происходит перезапуск обработки особой ситуации. Такое выражение-запуска может появится только в самом обработчике или в функции, которая непосредственно или опосредованно вызывается из него. Например, фрагмент программы, который выполняется при обработке особой ситуации, если нельзя еще полностью провести эту обработку, может выглядеть так:
R.15.3 Конструкторы и деструкторы
Когда управление передается из точки запуска особой ситуации обработчику, то вызываются деструкторы для всех автоматических объектов, построенных с момента входа в проверяемый-блок.
Если объект не был построен полностью, то деструкторы вызываются только для полностью построенных вложенных в него объектов. Кроме того, если особая ситуация запускается в конструкторе при построении элемента автоматического массива, то уничтожаться будут только уже построенные элементы этого массива.
Процесс вызова деструкторов для уничтожения автоматических объектов, построенных в ходе выполнения программы от начала проверяемого-блока до выражения-запуска, называется "раскручиванием стека".
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).
Рассмотрим пример: