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

на главную

Жанры

Справочное руководство по 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) {

//…

 }

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

Кровь Василиска

Тайниковский
1. Кровь Василиска
Фантастика:
фэнтези
попаданцы
аниме
4.25
рейтинг книги
Кровь Василиска

Венецианский купец

Распопов Дмитрий Викторович
1. Венецианский купец
Фантастика:
фэнтези
героическая фантастика
альтернативная история
7.31
рейтинг книги
Венецианский купец

Сопряжение 9

Астахов Евгений Евгеньевич
9. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
технофэнтези
рпг
5.00
рейтинг книги
Сопряжение 9

На три фронта

Бредвик Алекс
3. Иной
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
На три фронта

Авиатор: назад в СССР 11

Дорин Михаил
11. Покоряя небо
Фантастика:
альтернативная история
5.00
рейтинг книги
Авиатор: назад в СССР 11

Санек

Седой Василий
1. Санек
Фантастика:
попаданцы
альтернативная история
4.00
рейтинг книги
Санек

Лорд Системы 8

Токсик Саша
8. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 8

Мерзавец

Шагаева Наталья
3. Братья Майоровы
Любовные романы:
современные любовные романы
эро литература
короткие любовные романы
5.00
рейтинг книги
Мерзавец

Игра топа. Между двух огней

Вяч Павел
2. Игра топа
Фантастика:
фэнтези
7.57
рейтинг книги
Игра топа. Между двух огней

Провинциал. Книга 2

Лопарев Игорь Викторович
2. Провинциал
Фантастика:
космическая фантастика
рпг
аниме
5.00
рейтинг книги
Провинциал. Книга 2

Идущий в тени 6

Амврелий Марк
6. Идущий в тени
Фантастика:
фэнтези
рпг
5.57
рейтинг книги
Идущий в тени 6

На границе империй. Том 9. Часть 4

INDIGO
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 4

Крестоносец

Ланцов Михаил Алексеевич
7. Помещик
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Крестоносец

Идеальный мир для Лекаря 10

Сапфир Олег
10. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 10