Здравствуйте, форумчане!
Подскажите пожалуёста, если я создаю собственный класс ошибок, всегда ли он должен быть производным от std::exception?
Я решил написать класс rational, представляющий смешанное число. В результате сложения может призойти переполнение, или может быть попытка присвоить знаменателю нулевое значение — всё это исключительные ситуации. Я создал простую иерархию классов ошибок, базовый класс содержит только номер ошибки, а все производные — функцию-член, возвращающие этот номер. Мне кажется, такая система удобна в отладке, но стоит ли её оставлять как есть? Может лучше наследовать базовый класс от std::exceptin? Просто все строки, возвращаемые функцией what занимают места намного больше, чем сам экземпляр класса.
//Классы ошибок
//базовый класс для всех ошибок при действиях со смешанными числами
class rational_exception
{
protected:
unsigned short err_code;
public:
unsigned short get_err_code(){return err_code;}
};
//базовый класс ошибок переполнения
//(результат операции не может быть записан в unsigned long long)
class overflow : public rational_exception
{
};
//переполнение, возникшее в результате сложения двух чисел типа unsigned long long
class addition_overflow : public overflow
{
public:
addition_overflow(){err_code = 0;}
explicit addition_overflow(unsigned char err_num){err_code = err_num;}
};
//переполнение, возникшее в результате умножения двух чисел типа unsigned long long
class multiplication_overflow : public overflow
{
public:
multiplication_overflow(){err_code = 0;}
explicit multiplication_overflow(unsigned char err_num){err_code = err_num;}
};
//переполнение, возникшее в результате преобразования строки в чисело типа unsigned long long
class recognition_overflow : public overflow
{
public:
recognition_overflow(){err_code = 0;}
explicit recognition_overflow(unsigned char err_num){err_code = err_num;}
};
//базовый клас ошибок неверного ввода
class invalid_in : public rational_exception
{
};
//в результате операции ввода была попытка присвоить знаменателю 0
class null_denominator : public invalid_in
{
public:
null_denominator(){err_code = 0;}
explicit null_denominator(unsigned char err_num){err_code = err_num;}
};
//ошибка ввода - введённая строка не может быть распознана как смешанное число
class is_not_rational_in : public invalid_in
{
public:
is_not_rational_in(){err_code = 0;}
explicit is_not_rational_in(unsigned char err_num){err_code = err_num;}
};
//базовый клас ошибок конструкторов
class invalid_constr_arg : public rational_exception
{
};
//В конструктор передан 0 для присвоения знаменателю
class null_denominator_in_constroctor : public invalid_constr_arg
{
public:
null_denominator_in_constroctor(){err_code = 0;}
explicit null_denominator_in_constroctor(unsigned char err_num){err_code = err_num;}
};