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;
}

 


Споріднені теми