На этом шаге мы рассмотрим создание классов исключений, производных от 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.
На следующем шаге мы рассмотрим использование распределителей памяти.