1

Тема: Повідомлення про допущену помилку у конструкторі класу.

Маю невелике питання, що стосується семантики.
Чи це буде нормально, якщо я у конструктор класу виключень втавлю повідомлення про помилку, а уловлюючий блок залишу пустим?

2 Востаннє редагувалося koala (31.08.2013 20:46:58)

Re: Повідомлення про допущену помилку у конструкторі класу.

Я, може, не зовсім зрозумів, що таке

у конструктор класу виключень втавлю повідомлення про помилку

але пустий блок обробки виключеної ситуації просто означає, що виключна ситуація буде перехоплена, і жодних дій зроблено не буде.
Крім того, для мене загадка, що є "нормальним" стосовно семантики. Нормальним є все, що виконує свою функцію, є зрозумілим для прочитання і дозволяє більш-менш легко вносити правки.

Подякували: incred1

3

Re: Повідомлення про допущену помилку у конструкторі класу.

ТС, якщо ви мали на увазі передачу повідомлення до конструктора чи його "зашивання" безпосередньо у тіло конструктора, то тут два варіанти:

1. Якщо клас "намертво" зв'язаний з описом помилки (типу MyCoolException("Exception of me cool happened!!11") ), то можна зашити.
2. Якщо повідомлення може варіюватися, але ви не хочете копіпасти "магічних рядків-констант" - винесіть її кудись як #define і підставляйте цю С-константу до конструктора.

4 Востаннє редагувалося incred (01.09.2013 07:04:27)

Re: Повідомлення про допущену помилку у конструкторі класу.

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;
}

//Питання: чи можна зробити такий "універсальний" коструктор?

5

Re: Повідомлення про допущену помилку у конструкторі класу.

По-перше, така структура - це не ООП. case переважно означає наявність якоїсь проблеми із ООП, він має покриватися поліморфізмом. Створіть ієрархію класів помилок і ловіть, що вам треба.
По-друге, якщо ви хочете щось зробити у випадку виключної ситуації, то маєте щось писати в дужках. Хоча б якесь шаблонне

throw 125;//C++ таке вміє
...
catch(int n){someClass::anError E(n);}

а у вас об'єкт anError буде створюватися в throw, не в catch. І нема на те ради.

Подякували: incred1

6

Re: Повідомлення про допущену помилку у конструкторі класу.

дякую за пояснення

7

Re: Повідомлення про допущену помилку у конструкторі класу.

І ще 5 копійок до теми:

Якщо ви по тілу програми будете генерувати throw MyCoolException() як результат умови if/switch - не раджу зловживати магічними константами (на кшалт отих 125, 1): це робить код криваво-читабельним.

8

Re: Повідомлення про допущену помилку у конструкторі класу.

Ну і взагалі має бути десь так...

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;}//обробляємо що завгодно
Подякували: incred2