C++.Бархатный путь




Управление исключением - блоки try и catch, операция throw - часть 3


throw 1; throw "Это сообщение об исключении…"; throw 2*2*fVal; throw (int)5.5; throw (ComplexType)125.96; /* Разумеется, если определён соответствующий конструктор преобразования или функция приведения. */

Для генератора важны как значение выражения-исключения, так и его тип. Иногда даже конкретное значение исключения не так важно, как его тип.

В качестве исключения может быть использовано значение указателя. Допускаются исключения и такого вида:

throw NULL; throw (void *) &iVal;

И, естественно, не существует быть генераторов исключений для выражений типа void. Пустой тип не имеет значений.

Обычно генератор исключения используется в сочетании с try-блоком. Их взаимодействие обеспечивается через стек вызова. Поэтому точка генерации исключения должна располагаться в теле функции, непосредственно или косвенно вызываемой из множества операторов данного try-блока. В крайнем случае, генератор исключения сам может быть одним из операторов этого try-блока.

Рассмотрим небольшой пример, после которого опишем основные принципы взаимодействия генератора и блока перехвата исключений.

Но сначала вспомним пару форм Бэкуса-Наура, посвящённых объявлению и определению функций. Речь пойдёт о спецификации исключения. С первого взгляда всё это уже кажется простым и понятным:

ОбъявлениеФункции ::= [СписокСпецификаторовОбъявления] Описатель

[СпецификацияИсключения];

ОпределениеФункции ::= [СписокСпецификаторовОбъявления] Описатель

[ctorИнициализатор] [СпецификацияИсключения] ТелоФункции

СпецификацияИсключения ::= throw ([СписокТипов])

СписокТипов ::= [СписокТипов ,] ИмяТипа

Из последнего уточнения структуры объявления и определения функции следует, что объявление и определение любой функции может быть дополнено спецификацией исключения. Эта спецификация является дополнительным элементом заголовка функции и состоит из ключевого слова throw и заключённого в круглые скобки списка типов. При этом пустой список типов эквивалентен полному отсутствию спецификации исключения.

Назначение спецификации исключения мы обсудим позже, а пока - демонстрация особенностей работы механизма управления исключениями.




Содержание  Назад  Вперед