Чтение онлайн

на главную - закладки

Жанры

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

Страустрап Бьярн

Шрифт:

список-обработчиков:

 обработчик список-обработчиков opt

обработчик:

 catch ( описание-особой-ситуации ) составной-оператор

описание-особой-ситуации:

 список-спецификаций-типа описатель

 список-спецификаций-типа абстрактный-описатель

 список-спецификаций-типа

 …

выражение-запуска:

 throw
выражение opt

Конструкция проверяемый-блок является оператором (§R.6), а выражение-запуска - унарным выражением типа void (§R.5). Иногда выражение-запуска называют "точкой запуска", а про функцию, в которой встретилось выражение-запуска, говорят, что она "запускает особую ситуацию. Часть программы, которой передается управление из точки запуска называется обработчиком.

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; // передача остальных особых ситуаций другому обработчику

}

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).

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

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) {

//…

 }

Поделиться:
Популярные книги

Герцогиня в ссылке

Нова Юлия
2. Магия стихий
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Герцогиня в ссылке

Газлайтер. Том 8

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

Мастер Разума VII

Кронос Александр
7. Мастер Разума
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер Разума VII

Мое ускорение

Иванов Дмитрий
5. Девяностые
Фантастика:
попаданцы
альтернативная история
6.33
рейтинг книги
Мое ускорение

Если твой босс... монстр!

Райская Ольга
Любовные романы:
любовно-фантастические романы
5.50
рейтинг книги
Если твой босс... монстр!

Трудовые будни барышни-попаданки 2

Дэвлин Джейд
2. Барышня-попаданка
Фантастика:
попаданцы
ироническое фэнтези
5.00
рейтинг книги
Трудовые будни барышни-попаданки 2

Законы Рода. Том 9

Flow Ascold
9. Граф Берестьев
Фантастика:
городское фэнтези
попаданцы
аниме
дорама
фэнтези
фантастика: прочее
5.00
рейтинг книги
Законы Рода. Том 9

Ротмистр Гордеев 3

Дашко Дмитрий
3. Ротмистр Гордеев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Ротмистр Гордеев 3

Новик

Ланцов Михаил Алексеевич
2. Помещик
Фантастика:
альтернативная история
6.67
рейтинг книги
Новик

Николай I Освободитель. Книга 5

Савинков Андрей Николаевич
5. Николай I
Фантастика:
альтернативная история
5.00
рейтинг книги
Николай I Освободитель. Книга 5

Провалившийся в прошлое

Абердин Александр М.
1. Прогрессор каменного века
Приключения:
исторические приключения
7.42
рейтинг книги
Провалившийся в прошлое

Последний из рода Демидовых

Ветров Борис
Фантастика:
детективная фантастика
попаданцы
аниме
5.00
рейтинг книги
Последний из рода Демидовых

Русь. Строительство империи 2

Гросов Виктор
2. Вежа. Русь
Фантастика:
попаданцы
альтернативная история
рпг
5.00
рейтинг книги
Русь. Строительство империи 2

Мастер 3

Чащин Валерий
3. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер 3