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


 

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

20661. Философские идеи Сократа 41.5 KB
  Философ считал что письмена делают знания отстранёнными внешними для человека и мешают глубокому пониманию истины и воспитанию личности. Поэтому считая что истина содержится внутри самого человека предпочитал живой диалог спор как единственно правильное средство получения достоверных знаний о мире. Второй зрелый этап сосредоточен на раскрытие природы человека. Философия должна открывать человека исследовать его так как именно в нас заключено то познавательное начало которое способно изучать и аккумулировать знания как о себе...
20662. Философское учение Платона 70.5 KB
  Платон настоящее имя Аристокл Платон от греческого platys широкоплечий полный 427 347 год до н. Платон был основателем собственной философской школы занятия слушателей которой проходили в роще посвящённой античному герою Академу что непосредственно повлияло на её название Академия. Философская Академия Платона просуществовала 915 лет.
20663. Философия Аристотеля, Критика платоновского учения об идеях 72.5 KB
  Аристотель 384 322 год до н. Аристотель проучившись в платоновской академии 20 лет вплоть до смерти Платона развивал философские положения своего учителя придерживаясь объективного идеализма и смог привнести в это течение новые неоспоримо значимые идеи. Аристотель предпочитал проводить занятия со своими учениками прогуливаясь по саду вблизи школы. Для обозначения философской школы Аристотеля используется и такое название как перипатетика от греческого peripatio крытая галерея занятия Аристотель проводил не только прогуливаясь...
20664. Философские школы поздней античности (эллинистическая эпоха) 186.5 KB
  Если ранее у греков существовало представление о своём духовном превосходстве над варварами не способных к культуре и к свободной деятельности что запечатлевалось даже в работах Платона и Аристотеля то в новую эпоху взаимовлияния культур формируется представление о едином бытие человека. Под влиянием восточных культур например астрологических и мистических течений Вавилона происходит эклектическое соединение рационального и сверхъестественного в понимание мира что пагубно отражается и на морали где вера в судьбу в определённость...
20665. Специфика философской мысли в эпоху средневековья 76 KB
  Этот период патристика сталкивается с внутренним противоречием которое выражено в том что стремление посредством рациональной аргументации доказать бытие Бога бессмертие души и прочих сакральных компонентов христианской догматики идёт в разрез с краеугольным положением религии о непостижимости при помощи разума божественных таинств доступных только исключительно в вере. Обсуждаются проблемы: а тринитальный вопрос о единстве и троичности Бога; б христологический вопрос о сочетание в Христе двух начал природного и божественного; в...
20666. Характерные черты эпохи Возрождения 77.5 KB
  Разум в силу своей конечности и определённости пропорцией не является истиной и не способен её постигать настоль точно чтобы утверждать о её исчерпанности. Отсутствие пропорциональности которую мы способны зафиксировать только в конечных вещах является причиной нашего незнания. Конечность нашего ума является источником диспропорции между разумом и бесконечностью в которую он включён и которую стремиться познать. На общем онтологическом уровне индивид связывает все вещи и поэтому является микрокосмом любой вещи.
20667. Учение о субстанции в философии Бенедикта Спинозы и Готфильда Лейбница 51 KB
  Таким образом для Спинозы субстанция является causa sui причиной самой себя. Движение по мнению Спинозы относится лишь к миру модусов и не является атрибутом субстанции по той причине что для его осуществления необходима внешняя причина воздействие связи которая может существовать только в природе порождаемой. По его мнению абсолютно свободен лишь Бог так как является вселенским порядком и субстанцией вбирает в себя и определяет все природные причинноследственные связи необходимость. И так как в мире вещей господствует...
20668. Английский материализм и эмпиризм 17-18 века 64.5 KB
  Согласно Гоббсу каждый из нас стремиться рассуждать о какихнибудь вещах поэтому желание философствовать это врождённое состояние человека свойственное ему от природы. Гоббс таким образом показывает прямую зависимость мышления человека от материального мира и его эмпирического восприятия. Философия природы занимается естественными телами в том числе и изучением тела человека. Данный тип философии направлена на трактовку умственных и нравственных способностей человека этика и определение обязанностей гражданина политика.
20669. Философия французского просвещения. Характерные черты эпохи Просвещения 58 KB
  Главным положением данной эпохи становится указание на первостепенное значение разума рассудка для деятельности человека что например было запечатлено в таких высказываниях как Имей мужество пользоваться своим умом или Дерзай быть мудрым Sapere ande. Вера в человеческий разум выразилась в убеждении о решающей роли естественнонаучных знаний; в стремлении освободиться от предрассудков слепой религиозности невежества неопределённых метафизических догм неподдающихся научной проверке; в пересмотре интеллектуальных ценностей...