Поток управления в случае, когда пользователь вводит нулевой делитель

Давайте теперь рассмотрим более интересный случай, когда пользователь

вводит делимое 100 и делитель 0 (что соответствует третьей и четвертой

строчкам в окне вывода на рис. 16.2). В строке 16 quotient определяет, что

denominator равен нулю, т.е. имеет место попытка деления на ноль. Строка 17

выбрасывает исключение, которое мы представляем как объект класса

DivideByZeroException (рис. 16.1).

Обратите внимание, что в строке 17 используется ключевое слово throw, за

которым следует операнд, представляющий тип исключения, которое мы

хотим выбросить. Обычно оператор throw специфицирует единственный

операнд. (В разделе 16.5 мы обсудим, каким образом используется throw без

операнда.) Операнд в операторе throw может быть любого типа. Если он является

объектом, мы называем его объектом исключения; в данном примере объект

исключения является объектом класса DivideByZeroException. Однако

операнд мог бы принимать и другие значения, например, значение выражения

(скажем, throw x > 5) или значение целого типа (throw 5). В примерах этой

главы мы имеем дело только с исключениями-объектами.

В процессе выбрасывания исключения создается операнд throw, которым

инициализируется параметр catch-обработчика, который мы обсудим через

минуту. В нашем примере оператор throw в строке 17 создает объект класса

DivideByZeroException. Когда строка 17 выбрасывает исключение,

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

выбрасывается до того, как функция сможет произвести деление в строке 20.

Функция должна выбрасывать исключение до того, как ошибка получит

возможность произойти.

Поскольку мы заключили вызов функции quotient (строка 38) в try-блок,

программное управление входит в catch-обработчик (строки 43-47),

непосредственно следующий за try-блоком. Этот catch-обработчик служит в качестве

обработчика для исключений типа «деление на ноль». Вообще, когда

исключение выбрасывается внутри try-блока, оно перехватывается

catch-обработчиком, который специфицирует тип, согласованный с выброшенным

исключением. В данной программе catch-обработчик специфицирует, что он

перехватывает объекты DivideByZeroException; этот тип согласуется с типом объекта,

выбрасываемого в функции quotient. На самом деле этот обработчик

перехватывает ссылку на объект DivideByZeroException, созданный оператором

throw в функции quotient (строка 17).

Тело catch-обработчика (строки 45-46) печатает ассоциированное с

исключением сообщение об ошибке, возвращаемое вызовом функции what базового

класса runtime_error. Функция возвращает строку, которую конструктор

DivideByZeroException (строки 12-13 на рис. 16.1) передает конструктору

базового класса runtime_error.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: