Тема: Повідомлення про допущену помилку у конструкторі класу.
Маю невелике питання, що стосується семантики.
Чи це буде нормально, якщо я у конструктор класу виключень втавлю повідомлення про помилку, а уловлюючий блок залишу пустим?
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → C++ → Повідомлення про допущену помилку у конструкторі класу.
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Маю невелике питання, що стосується семантики.
Чи це буде нормально, якщо я у конструктор класу виключень втавлю повідомлення про помилку, а уловлюючий блок залишу пустим?
Я, може, не зовсім зрозумів, що таке
у конструктор класу виключень втавлю повідомлення про помилку
але пустий блок обробки виключеної ситуації просто означає, що виключна ситуація буде перехоплена, і жодних дій зроблено не буде.
Крім того, для мене загадка, що є "нормальним" стосовно семантики. Нормальним є все, що виконує свою функцію, є зрозумілим для прочитання і дозволяє більш-менш легко вносити правки.
ТС, якщо ви мали на увазі передачу повідомлення до конструктора чи його "зашивання" безпосередньо у тіло конструктора, то тут два варіанти:
1. Якщо клас "намертво" зв'язаний з описом помилки (типу MyCoolException("Exception of me cool happened!!11") ), то можна зашити.
2. Якщо повідомлення може варіюватися, але ви не хочете копіпасти "магічних рядків-констант" - винесіть її кудись як #define і підставляйте цю С-константу до конструктора.
class someClass {
    //якісь поля
public:
    class anError {   //якийсь клас помилок
    public:
        anError(int x) {   //власне, тут я і хочу обробляти УСІ помилки
            switch(x) {
            case 1: {
                cout<<"Exception №1: Illegal index!"; //чи щось таке
                //тут якось намагаємося виправити помилку
                break;
            }
            ...
            case 125: { 
                cout<<"Exception №125: Very long string! ";
                //то саме
                break;
            }
            }  //кінець switch
        } //кінець anError(int)
    }; //кінець anError
    ...
    void func() {   //якийсь метод, де може бути допущена помилка
        if( /* тут умова */ )
            throw anError(125);
    }
};
void main() {
    someClass obj1;
    try {
        ...
        obj1.func();
        ...
    }
    catch(someClass::anError) {  } //а тут пусто: в іншому випадку замість кейсів я створював би
                          //блоки кеч
    return 0;
}
//Питання: чи можна зробити такий "універсальний" коструктор?По-перше, така структура - це не ООП. case переважно означає наявність якоїсь проблеми із ООП, він має покриватися поліморфізмом. Створіть ієрархію класів помилок і ловіть, що вам треба.
По-друге, якщо ви хочете щось зробити у випадку виключної ситуації, то маєте щось писати в дужках. Хоча б якесь шаблонне
throw 125;//C++ таке вміє
...
catch(int n){someClass::anError E(n);}а у вас об'єкт anError буде створюватися в throw, не в catch. І нема на те ради.
дякую за пояснення
І ще 5 копійок до теми:
Якщо ви по тілу програми будете генерувати throw MyCoolException() як результат умови if/switch - не раджу зловживати магічними константами (на кшалт отих 125, 1): це робить код криваво-читабельним.
Ну і взагалі має бути десь так...
class Exception
{
  public:
  virtual void dispatch()=0;
};
class IllegalIndexException:public Exception
{
  //перевизначення dispatch
};
class VeryLongStringException:public Exception
{
  //перевизначення dispatch
};
//десь в коді...
throw new VeryLongStringException;//правда, красивіше, ніж 125?
...
catch(Exception *E){E->dispatch();delete E;}//обробляємо що завгодноСторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися