Обработка ошибок и исключений. Классы исключений, производные от 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.

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



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий