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-настанов на протилежний.


 

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

43795. ПРОЕКТ ШВЕЙНОГО ЦЕХА 248.75 KB
  Проектируемая модель жакета женского имеет красивый внешний вид, модные отделочные элементы в виде присборенного лацкана, центральной части переда, свободного рукава, отделочных строчек соответствует современному направлению моды. Для жакета подобраны пуговицы которые служат не только для застегивания, а также для украшения жакета
43796. Проектирование и создание коллекции женской нарядной одежды 1.99 MB
  Моя коллекция - нарядная, подходит для похода на выставку, в театр, на коктейль, с другой стороны некоторые модели более повседневны и деловые. Строгие силуэты и классический покрой делает ее близкой к классическому стилю. Но с помощью активной отделки рюшами и воланами просматривается и романтический стиль.
43797. Обгрунтування проекту вдосконалення системи управління якістю продукції 387.41 KB
  Оцінка впливу запропонованих заходів на основні результати діяльності підприємств На сучасному ринку переважає попит на продукцію найвищої якості. Не менш гостра конкуренція за виробництво і реалізацію продукції вищої якості. У зв'язку з цим підвищується роль методів забезпечення якості які сприяють проведенню нової політики в галузі якості та задоволенню постійно зростаючих вимог ринку до якості продукції. Розвиток експортних відносин показав що продукція вітчизняних...
43798. Совершенствование сбытовой политики на ОАО «Метафракс» 331.63 KB
  Характеристика каналов сбыта товаров промышленного назначения. Она позволяет осуществлять: планирование формирование или рациональный выбор каналов распределения товаров; поиск и освоение новых каналов сбыта; разработку и применение сбытовой программы организации с учетом реального и прогнозируемого ассортимента а также запросов потребителей; оценку результатов деятельности организации по производству товаров и доведению их до потребителя. Работа предприятий в новых экономических условиях предполагает реструктурирование всех...
43799. Татарча-русча сүзлекләрдә тамыр рәвешендәге гарәп-фарсы алынмалары 295 KB
  Татар теленнән аермалы буларак, гарәп телендә сузыкларның әйтелеше тартыкларга бәйле. Сүздә нинди тартыклар белән килүенә карап, сузык авазның әйтелеше үзгәрә, ягъни сөйләмдә фонеманың төрле вариантлары барлыкка килә. Мәсәлән, а сузыгы эмфатик һәм башка кайбер тартыклар
43800. Использование метода проектов на формирование речевой компетенции на уроке иностранного языка 1.86 MB
  Психолого педагогические исследования по проблемам формирования речевых навыков на уроках иностранного языка. Опытнопрактические работы по использованию методов проектов как средство формирования речевых умений на уроках иностранного языка. Основная идея подобного подхода к обучению английского языка таким образом заключается в том чтобы перенести акцент со всякого рода упражнений на активную мыслительную деятельность учащихся требующую для своего оформления владения определенными языковыми средствами. Только метод проектов...
43801. Внутрихозяйственное землеустройство крестьянско-фермерского хозяйства «ДИДИНАГ» 98.87 KB
  После 1996 года были свернуты работы по оказанию помощи хозяйствам в осуществлении проектов внутрихозяйственного землеустройства авторскому надзору и составлению рабочих проектов по улучшению и охране земель даже на сельскохозяйственных землях находящихся в федеральной собственности. Состав и содержание проекта зависят от природных и социальноэкономических условий форм землевладения и землепользования специализации хозяйства состава и соотношения отраслей условий расселения развития элементов инфраструктуры. Размещение...
43803. Проект внутрихозяйственного землеустройства крестьянско-фермерского хозяйства «ДИДИНАГ» 124.15 KB
  В вышеперечисленных составных частях проекта внутрихозяйственного землеустройства разрабатываются общехозяйственные вопросы, создающие в итоге производственную структурную основу организации территории. Дальнейшая задача заключается в устройстве территории отдельных видов угодий, разделение их на обособленные хозяйственные участки: поля севооборотов, загоны очередного стравливания на пастбищах, сенокосооборотные и бригадные участки на сенокосах.