Класс exception. Использование класса для обработки исключительных ситуаций
Содержание
- 1. Класс exception. Общие сведения
- 2. Пример генерирования простого исключения класса exception
- 3. Пример разработки функции, использующей класс exception для генерирования исключения, возникающего в случае, если квадратное уравнение не имеет решения
- Связанные темы
Поиск на других ресурсах:
1. Класс exception. Общие сведения
Стандартная библиотека C++ предоставляет в использование класс exception для обработки исключительных ситуаций. Чтобы использовать возможности класса exception, нужно подключить заголовок <exception>
#include <exception>
Класс имеет примерно следующее описание:
class exception { public: exception() throw(); exception(const bad_exception& ob) throw(); virtual ~exception() throw(); exception &operator=(const exception& ob) throw(); virtual const char* what() const throw(); };
Класс exception является базовым для всех исключительных ситуаций, определенных стандартом C++. Любая исключительная ситуация описывается определенным классом. Ниже представлен список важных классов, унаследованных из класса exception:
- класс bad_alloc – генерирует исключительную ситуацию в случае неудачной попытки выделения памяти оператором new;
- класс bad_typeid – генерирует исключительную ситуацию при неудачном выполнении оператора typeid;
- класс bad_cast – генерирует исключительную ситуацию при неудачном динамическом приведении типов.
В каждом из унаследованных классов имеется функция what(), возвращающая указатель на строку, которая завершается символом ‘\0’. Именно через эту функцию можно получать строку с объяснением причины возникновения той или иной исключительной ситуации.
⇑
2. Пример генерирования простого исключения класса exception
В примере демонстрируется искусственное генерирование и перехват исключения типа exception. По подобному образцу можно разрабатывать классы, функции описывающие (реализующие) собственную уникальную систему исключений.
#include <iostream> #include <exception> using namespace std; // Класс exception, пример генерирования простого исключения void DemoException() { try { std::exception err("My error"); // создать объект throw err; // сгенерировать исключение } catch (std::exception& error) { std::cout << error.what() << endl; } } void main(void) { DemoException(); return; }
Результат выполнения программы
My error
⇑
3. Пример разработки функции, использующей класс exception для генерирования исключения, возникающего в случае, если квадратное уравнение не имеет решения
Предлагается функция, решающая квадратное уравнение на основе входных коэффициентов a, b, c. Как известно, при некоторых значениях a, b, c невозможно получить решение уравнения. В целях демонстрации функция генерирует исключение, если квадратное уравнение не имеет корней. Для создания исключения используется класс exception.
#include <iostream> #include <exception> // нужно для использования класса exception using namespace std; // Пример перехвата исключения отсутствия решения // квадратного уравнения в функции. // Параметры функции: // - a, b, c - коэффициенты уравнения a*x^2 + b*x + c = 0; // - x1, x2 - решения уравнения. // Функция возвращает true, если решение существует, // в противном случае функция возвращает false. bool DemoSquareEquation(double a, double b, double c, double& x1, double& x2) { // 1. Дополнительные внутренние переменные double D; // дискриминант // 2. Вычислить дискриминант D = b * b - 4 * a * c; // 3. Обработка значення D try { if (D < 0) // Если уравнение не имеет решения { // То сгенерировать исключение // 3.1. Создать объект error типа exception exception error("The equation has no roots"); // 3.2. Сгенерировать исключение throw error; } } catch (exception& e) { // 3.3. Вывести результат исключения cout << e.what() << endl; return false; } // 4. Если уравнение имеет решение, то получить и вернуть результат x1 = (-b - sqrt(D)) / (2 * a); x2 = (-b + sqrt(D)) / (2 * a); // 5. Вернуть результат return true; } void main(void) { // 1. Объявить внутренние переменные double x1, x2; // 2. Вызов функции DemoSquareEquation if (DemoSquareEquation(2, 3, 4, x1, x2)) { cout << "x1 = " << x1 << endl; cout << "x2 = " << x2 << endl; } return; }
⇑
Связанные темы
- Понятие исключительной ситуации. Инструкция try-catch. Оператор throw. Примеры использования
- Пример создания иерархии классов для обработки исключительных ситуаций
⇑