67361

Перехоплення винятків класового типу

Лекция

Информатика, кибернетика и программирование

Виняток може мати будь-який тип, у тому числі і класового типу, створенного програмістом. У реальних програмах більшість винятків мають саме класовий тип, а не вбудований тип. Ймовірно, тип класу найбільше підходить для опису помилки, яка потенційно...

Украинкский

2014-09-07

71 KB

1 чел.

Лекція № 23

Тема: Перехоплення винятків класового типу

План

Перехоплення винятків класового типу

Використання декількох catch-настанов

Перехоплення винятків базового класу.

Перехоплення винятків класового типу

   Виняток може мати будь-який тип, у тому числі і класового типу, створенного програмістом. У реальних програмах більшість винятків мають саме класовий тип, а не вбудований тип. Ймовірно, тип класу найбільше підходить для опису помилки, яка потенційно може виникнути у програмі, як це показано у наведенному нижче прикладі. Інформація, яка міститься в об'єкті класу винятків, дає змогу спростити процес їх оброблення.

Приклад. Демонстрація механізму перехоплення винятків класового типу

 

class myException

{

     public:

 char str[80];

myException() { *str = 0; }

myException(char *s) { strcpy(str, s); }

};

void main()

{             int a, b;

 try

{          cout << "Vvedit 4uselnuk i znamennuk: ";

 cin >> a >> b;

 if(!b) throw myException("Dilutu na 0 ne mo*na!");

     else 

 cout << "4astka = " << a/b << endl;

}

 catch(myException e)

              {      // Перехоплення помилки

 cout << e.str << endl;

}

}  

   Один з можливих результатів виконання цієї програми.

Введіть чисельник і знаменник: 10 0

Ділити на нуль не можна!

   Після запуску програми користувачу пропонується ввести чисельник і знаменник. Якщо знаменник дорівнює нулю, то створюється об'єкт класу myException, який містить інформацію про спробу ділення на нуль. Також клас myException інкапсулює інформацію про помилку, яка потім використовується обробником винятків для повідомлення користувача про те, що трапилося.

   Безумовно, реальні винятки класового типу набагато складніші за клас myException. Як правило, створення винятків класового типу має сенс у тому випадку, якщо вони інкапсулюють інформацію, яка дає змогу обробнику винятків ефективно справитися з помилкою і за змогою відновлює працездатність програми.

Використання декількох catch-настанов

   Як уже зазначалося вище, з try-блоком можна пов'язувати не одну, а декілька catch-настанов. Насправді саме такий підхід і застосовується найчастіше. Але при цьому всі catch-настанови повинні перехоплювати винятки різних типів. Наприклад, у наведеному нижче коді програми забезпечується перехоплення як цілих чисел, так і показників на символи.

Приклад. Демонстрація механізму використання декількох catch-настанов

 

   // Тут можливе перехоплення винятків різних типів.

void Xhandler(int test)

{

            try

{

 if(test) throw test;

     else 

  throw "Zna4ennja = 0";

}

 

            catch(int c)

{

 cout << "Perehoplennja! Vunjatok " << c << endl;

}

 catch(char *str)

{

 cout << "Perehoplennja rjadka : " << str << endl;

}

}

void main()

{                     

            cout << "Po4atok" << endl;

Xhandler(1);

Xhandler(2);

Xhandler(0);

Xhandler(3);

cout << "Kinec programu"<<endl;

}

   Внаслідок виконання ця програма відображає на екрані такі результати:

Початок.

Перехоплення! Виняток №: 1

Перехоплення! Виняток №: 2

Перехоплення рядка: Значення дорівнює нулю.

Перехоплення! Виняток №: 3

Кінець програми

   Як бачите, кожна catch-настанова відповідає тільки за винятки "свого" типу.

   У загальному випадку catch-вирази перевіряються у порядку їх проходження, тобто виконується тільки той catch-блок, у якому тип заданого винятку збігається з типом винятку, що згенерувався. Всі інші catch-блоки ігноруються.

Перехоплення винятків базового класу.

   Важливо розуміти, як виконуються catch-настанови, пов'язані з похідними класами. Йдеться про те, що catch-вираз для базового класу відреагує збігом на винятки будь-якого похідного типу (тобто типу, виведеного з цього базового класу). Отже, якщо потрібно перехоплювати винятки як базового, так і похідного типів, то у catch-послідовності catch-настанову для похідного типу необхідно помістити перед catch-настановою для базового типу. Інакше catch-вираз для базового класу перехоплюватиме крім "своїх" і винятки всіх похідних класів. Розглянемо, наприклад, такий код програми.

Приклад. Демонстрація механізму перехоплення винятків базових і похідних типів

 

class bClass

{

};

class dClass: public bClass

{

};

void main()

{      

            dClass derived;

 try { throw derived; }

 catch(bClass ObjB) {cout << "Perehoplennja vunjatky bazovogo klasy" << endl; }

 catch(dClass ObjD) {cout << "Ce perehoplennja ne vidbydetsja" << endl; }

}

   Оскільки тут об'єкт derived – це об'єкт класу dClass, який виведено з базового класу bClass, то виняток типу derived завжди перехоплюватиметься першим catch-виразом; друга ж catch-настанова при цьому ніколи не виконається. Одні компілятори відреагують на такий стан речей застережним повідомленням, інші можуть видати повідомлення про помилку. У будь-якому випадку, щоб виправити сиацію, достатньо поміняти порядок слідування цих catch-настанов на протилежний.


 

А также другие работы, которые могут Вас заинтересовать

22832. Ефект Пельтьє 70.5 KB
  Ефект Пельтьє. Дійсно експериментально така закономірність відома як ефект Пельтьє спостерігається. Встановлено що при проходженні електричного струму через контакт двох провідників напівпровідників виділяється чи поглинається в залежності від напрямку струму деяка кількість теплоти Qn пропорційна величині струму I та часу його протікання t: Qn=It 1 де  коефіцієнт Пельтьє. Ефект Пельтьє тим значніший чим більше відрізняються положення рівнів Фермі у напівпровідниках.
22833. РОЗШИРЕННЯ ШКАЛИ МІКРОАМПЕРМЕГРА ТА ВОЛЬТМЕТРА 73 KB
  Сила струму I обчислюється за формулою: 1 де Ca ціна поділки шкали мікроамперметра в амперах на поділку А под n відхилення стрілки у поділках шкали. Ціну поділки шкали мікроамперметра в одиницях напруги Cu можна обчислити за відомим внутрішнім опором мікроамперметра Rr та ціною поділки в одиницях сили струму Ca за формулою Cu=CaRr 2 При використанні мікроамперметра необхідно звертати увагу на такі характеристики як верхня та нижня межі значень вимірювання величин...
22834. РЕОСТАТ І ПОДІЛЬНИК НАПРУГИ 139.5 KB
  РЕОСТАТ І ПОДІЛЬНИК НАПРУГИ Реостат і подільник напруги – це прилади що застосовуються для регулювання сили струму і напруги в електричних схемах. Спад напруги на опорінавантаженні а на реостаті напруга на опорінавантаженні змінюватиметься від до . Подільником напруги може правити реостат з трьома клемами який підключається до електричного кола так як зображено на мал. Переміщуючи точку вздовж подільника напруги можна одержати будьяку напругу від до 0.
22835. МЕТОД КОМПЕНСАЦІЇ В ЕЛЕКТРИЧНИХ ВИМІРЮВАННЯХ 232 KB
  МЕТОД КОМПЕНСАЦІЇ В ЕЛЕКТРИЧНИХ ВИМІРЮВАННЯХ Вимірювання електрорушійної сили джерела струму методом компенсації. джерела струму дорівнює різниці потенціалів на полюсах розімкненого елемента. Вимірювання термоелектрорушійної сили диференціальної термопари за допомогою потенціометра постійного струму. Принцип роботи потенціометра постійного струму такий.
22836. ЗАЛЕЖНІСТЬ ОПОРІВ МЕТАЛІВ ТА НАПІВПРОВІДНИКІВ ВІД ТЕМПЕРАТУРИ 76 KB
  ЗАЛЕЖНІСТЬ ОПОРІВ МЕТАЛІВ ТА НАПІВПРОВІДНИКІВ ВІД ТЕМПЕРАТУРИ При підвищенні температури металу його опір електричному струму зростає. Температурний коефіцієнт характеризує відносну зміну опору при зміні температури на один градус:. 1 Величина не є постійною вона залежить від температури. Для багатьох металів ця залежність може бути описана таким виразом: 2 де опір при температурі опір при температурі яку прийнято за точку початку відліку температури; постійні величини які залежать від роду металу і вони...
22837. ВИВЧЕННЯ ЕЛЕКТРОСТАТИЧНИХ ПОЛІВ 208 KB
  ВИВЧЕННЯ ЕЛЕКТРОСТАТИЧНИХ ПОЛІВ Електростатичні поля описуються за допомогою скалярної величини – потенціалу або векторною величиною – напруженістю електричного поля де радіусвектор точки в якій поле вивчається. Аналітичний розрахунок цих величин в довільній точці поля можна провести як правило лише для найпростішого просторового розподілу електричних зарядів. Електростатичні поля складної форми зручніше досліджувати експериментально. Вектори напруженості поля завжди перпендикулярні до еквіпотенціальних поверхонь.
22838. Процеси в електричному колі змінного струму 123.5 KB
  Фаза струму через індуктивність менша на від фази прикладеної напруги а фаза струму через ємність випереджає фазу прикладеної напруги на . Розрахунок кіл змінного струму базується на законах Кірхгофа для кіл змінного струму. Довільна ділянка кола змінного струму може бути представлена комбінацією активного опору індуктивності та ємності.
22839. Спад напруги на реактивних опорах 57.5 KB
  Амплітуда спаду напруги на реактивному опорі визначається частотою коливань  а також величинами опорів C та R чи L. Якщо позначити амплітуду напруги що подається на вхід схеми мал.15 то спад напруги на ємності Амплітудне значення спаду напруги індуктивності де – активний опір котушок індуктивності.
22840. ВИМІРЮВАННЯ КОЕФІЦІЄНТА ПОВЕРХНЕВОГО НАТЯГУ РІДИНИ 271 KB
  Якщо капіляр занурити в рідину рідина підніметься або опуститься в капілярі на деяку висоту над рівнем рідини в посудині. Це явище пояснюється тим що тиск під поверхнею рідини залежить від форми поверхні. В капілярних трубках внаслідок взаємодії молекул рідини з молекулами речовини капіляра поверхня рідини викривлюється.