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


 

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

85402. Принцип комплексной организации осуществления экологического мониторинга 50.5 KB
  Принцип комплексной организации осуществления экологического мониторинга. В силу того что экологическим мониторингом предусматривается наблюдение оценка и прогноз антропогенных изменений абиотической составляющей биосферы и ответной реакции биологических систем на эти изменения в его организацию и осуществление закладывается принцип комплексного сочетания различных видов мониторинга окружающей среды. В 1978 году была обсуждена всемирная климатическая программа основной задачей которой было обеспечение климатического мониторинга и...
85403. Будова і принципи дії основних вузлів, агрегатів, механізмів і систем автомобілів з карбюраторними двигунами й дизелями 1.11 MB
  До кривошипношатунного механізму багатоциліндрових двигунів належать такі деталі: картер блок циліндрів з головкою й ущільнювальними прокладками; поршнева група поршні поршневі кільця поршневі пальці; шатуни; колінчастий вал; маховик; піддон картера. Блок циліндрів відливають із чавуну або алюмінієвих сплавів.
85404. Зобов’язально-правові способи забезпечення виконання зобов’язань 460 KB
  Актуальність теми дослідження полягає в тому що, ефективний розвиток економіки будь-якої країни певною мірою залежить від належного виконання договірних зобов’язань суб’єктами господарчої діяльності.
85405. Разработка графической концепции социальной акции на тему “Интернет-зависимое поколение” 4.29 MB
  Глобальная сеть уверенными шагами начинает развиваться, причем в геометрической прогрессии. Это видно по количеству пользователей в сети и количеству сайтов, которых с каждым днем становится все больше. Это всемирная компьютерная сеть, соединяющая вместе тысячи сетей, дающая доступ к любой информации.
85406. ПРАВОВОЕ РЕГУЛИРОВАНИЕ СТРАХОВАНИЯ ГРАЖДАНСКО-ПРАВОВОЙ ОТВЕТСТВЕННОСТИ ПО ЗАКОНОДАТЕЛЬСТВУ РОССИЙСКОЙ ФЕДЕРАЦИИ 653 KB
  Цель дипломной работы – исследовать институт страхования гражданско-правовой ответственности на основе правового анализа действующего законодательства, теории гражданского права, а также материалов судебной практики.
85407. Методические рекомендации: Техническое обслуживание и ремонт автомобильного транспорта 1.44 MB
  Основной целью настоящих методических рекомендаций является ознакомление студентов с возможной тематикой дипломного проектирования характером требований предъявляемых к дипломному проекту порядку работы над ним оформлением и защитой проекта.
85408. Оценка конкурентоспособности фирмы и определение путей ее повышения 1.21 MB
  Объектом исследования выступало ООО «Стеклодом», занимающееся производством и установкой светопрозрачных конструкций (оконные и балконные дверные блоки). Предмет исследования – конкурентоспособность организации.
85409. PR-СОПРОВОЖДЕНИЕ ДЕЯТЕЛЬНОСТИ ФЕДЕРАЛЬНОГО КАЗНАЧЕЙСТВА 1.98 MB
  Цель исследования – исследовать основные направления информационной политики органов государственной власти, в частности исполнительной власти, и провести анализ функционирования коммуникационной модели взаимодействия Федерального казначейства с общественностью.
85410. Пути повышения эффективности маркетинговой деятельности ООО «Принт – Экспресс» с применением Интернет 756.5 KB
  Целью работы являлась дать заключение о целесообразности применения российскими предприятиями возможностей глобальной сети Интернет в маркетинговой деятельности и повышении эффективности маркетинговой деятельности при внедрении в нее интернет-технологий.