Генерируем исключение

Bye!

Вызван обработчик const char *. исключение - Ошибка при открытии файла

Пример: обработка попытки деления на ноль

Давайте разберем простой пример управления исключениями (рис. 16.1-16.2).

Целью примера является предотвращение распространенной арифметической

ошибки — деления на ноль. В C++ деление на ноль в целой арифметике обычно

приводит к преждевременному завершению программы. В арифметике с

плавающей точкой деление на ноль допускается; его результатом является

положительная или отрицательная бесконечность, отображаемая как INF или —INF.

В данном примере мы определяем функцию с именем quotient, которая

принимает два введенных пользователем целых числа и делит свой первый

целый параметр на второй. Перед выполнением деления функция приводит

значение первого параметра к типу double. После этого значение второго целого

параметра для вычисления возводится до double. Так что функция quotient по

существу производит деление двух значений типа double и возвращает double.

Хотя в арифметике с плавающей точкой деление на ноль допускается, в целях

данного примера мы рассматриваем любую попытку деления на ноль как

ошибку. Функция quotient перед тем, как перейти к делению, проверяет второй

параметр, чтобы убедиться, что он ненулевой. Если второй параметр — ноль,

функция посредством исключения уведомляет вызывающего о возникшей проблеме.

Вызывающий (в данном случае main) может затем обработать это исключения

и дает пользователю возможность ввести два новых значения, после чего снова

вызывает quotient. Таким образом программа может продолжить исполнение,

даже если вводится неправильное значение, т.е. она делается более устойчивой.

Пример состоит из двух файлов — DivideByZeroException.h (рис. 16.1)

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

возникнуть в примере, a figl6_02.cpp (рис. 16.2) определяет функцию

quotient и функцию main, которая ее вызывает. Код, демонстрирующий

управление исключениями, содержится в main.

// Рис. 16.1: DivideByZeroException.h

// Определение класса DivideByZeroException.

#include <stdexcept> // заголовок stdexcept содержит runtime_error

using std::runtime_error; // стандартный класс runtime_error

// функции должны выбрасывать объекты DivideByZeroException

// при обнаружении исключений деления на ноль

class DivideByZeroException: public runtime_error

{

public:

// конструктор определяет сообщение по умолчанию

/*DivideByZeroException::*/DivideByZeroException()

: runtime_error("attempted to divide by zero") {}

}; // конец класса DivideByZeroException

// Рис. 16.2: TEST2.cpp

// Простой пример обработки исключений, проверяющий

// ошибки деления на ноль.

#include <iostream>

using std::cin;

using std::cout;

using std::endl;

#include "DivideByZeroException.h" // класс DivideByZeroException

// произвести деление и выбросить объект DivideByZeroException,

// если происходит деление на ноль

double quotient(int numerator, int denominator)

{

// выбросить DivideByZeroException при попытке деления на ноль

if (denominator == 0)

throw DivideByZeroException(); // завершить функцию

// возвратить результат деления

return static_cast< double >(numerator) / denominator;

} // конец функции quotient

int main()

{

int number1; // заданный пользователем числитель

int number2; // заданный пользователем знаменатель

double result; // результат деления

cout << "Enter two integers (end-of-file to end): ";

// прочитать два целых числа, введенные пользователем

while (cin >> number1 >> number2)

{

// try-блок содержит код, который может выбросить исключение,

//и код, который не должен исполняться при исключении

try

{

result = quotient(number1, number2);

cout << "The quotient is: " << result << endl;

} // конец try

// обработчик исключения обслуживает деление на ноль

catch (DivideByZeroException &divideByZeroException)

{

cout << "Exception occurred: " << divideByZeroException.what() << endl;

} // конец catch

cout << "\nEnter two integers (end-of-file to end): ";

} // конец while

cout << endl;

return 0; // нормальное завершение

} // конец main


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



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