C++. Класс exception

Класс 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;
}

 


Связанные темы