Шаг 53.
Библиотека STL.
Обработка ошибок и исключений. Классы исключений, производные от exception

    На этом шаге мы рассмотрим создание классов исключений, производных от exception.

    Существует и другой вариант использования стандартных классов исключений в программах. Он основан на определении специализированных классов, прямо или опосредованно производных от exception. При этом необходимо обеспечить работу механизма what() в производном классе.

    Функция what() объявлена виртуальной, поэтому один из вариантов предоставления функции what() основан на ее самостоятельной реализации:

namespace MyLib {
// Пользовательский класс исключений  
// объявлен производным от стандартного класса исключений.
  class MyProblem : public std::exception { 
    public:
      .    .    .    .
      MyProblem(...) {     // Специальный конструктор
      }
      virtual const char* what() const throw() { // Функция what()
      .    .    .    .
      }
};
.    .    .    .
void f() {
  // Создание объекта и генерирование исключения 
  throw MyProblem(...);
  .    .    .    .
}

    В другом варианте предоставления функции what() класс исключения объявляется производным от класса, имеющего конструктор со строковым аргументом для функции what():

namespace MyLib {
// Пользовательский класс исключения
// объявлен производным от стандартного класса
// с конструктором для аргумента what().
class MyRangeProblem : public std::out_of_range { 
  public:
    MyRangeProblem (const string& whatString) : 
        out_of_range(whatString) {
        .    .    .    .
        }
};
.    .    .    .
void f() {
  // Создание объекта конструктором со строковым аргументом
  // и генерирование исключения
  throw MyRangeProblem("here is my special range problem");
  .    .    .    .
}

    Примеры использования этого подхода встречаются в классах stack и queue.

    На следующем шаге мы рассмотрим использование распределителей памяти.




Предыдущий шаг Содержание Следующий шаг