Тема: Повідомлення про допущену помилку у конструкторі класу.
Маю невелике питання, що стосується семантики.
Чи це буде нормально, якщо я у конструктор класу виключень втавлю повідомлення про помилку, а уловлюючий блок залишу пустим?
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, 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
Для відправлення відповіді ви повинні увійти або зареєструватися