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