Наследование класса std::exception
От: Mak_71_rus Россия  
Дата: 01.07.10 17:39
Оценка:
Здравствуйте, форумчане!

Подскажите пожалуёста, если я создаю собственный класс ошибок, всегда ли он должен быть производным от 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;}
    };
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.