Генерируется исключение оператором throw (см. п. 15.1 в [1]), который имеет следующий синтаксис
throw выражение._генерации_исключения;
Выражение генерации исключения на практике означает либо константу, либо переменную некоторого типа. Тип объекта-исключения может быть любым, как встроенным, так и определяемым программистом. Например:
throw 7;
throw "Ошибка: деление на нуль!": throw Message[i]; throw M_PI;
В первом случае объект-исключение — это целая константа, которая может быть условным номером-кодом ошибки. В общем случае этот код ошибки может вычисляться, например:
Обычно говорят, что исключение возбуждается,- или выбрасывается. Но так как исключение — это объект, вполне уместно слово «генерировать», или «порождать».
throw 3*v-i;
Выражение, конечно, может быть не только целочисленным.
Второй вариант — это символьная константа, которая фактически является сообщением об ошибке. Все сообщения об ошибках могут быть записаны в массиве, например:
string Message[326];
Тогда в третьем варианте объект-исключение тоже представляет собой строку — сообщение об ошибке. В последнем примере в качестве объекта используется дробная константа — число .
Программист может и сам определить собственный тип объекта-исключения, объявив новый класс, например:
class NegativeArgument{}: NegativeArgument exeption; if (x>0) double t = x/sqrt(x): else throw exeption:
Пустые классы неожиданно пригодились! Однако объявлять переменную совсем не обязательно, можно обойтись и без этого, например:
throw NegativeArgument():
Здесь в качестве выражения генерации исключения мы использовали явный вызов конструктора без аргументов, и это наиболее распространенная форма генерации исключения.
Объект-исключение может быть и динамическим, например: throw new NegativeArgument();
Однако в этом случае возникает вопрос об уничтожении объекта-исключения и возврате памяти — неизвестно, в каком месте программы это можно сделать. Лучше не создавать себе проблем и не использовать указатели в качестве параметров блоков catch. |