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


 

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

81471. Незаменимые факторы питания липидной природы. Эссенциальные жирные кислоты: ω-3- и ω-6-кислоты как предшественники синтеза эйкозаноидов 125.89 KB
  Эссенциальные жирные кислоты: ω3 и ω6кислоты как предшественники синтеза эйкозаноидов. В эту группу входит комплекс полиненасыщенных жирных кислот которые принимают значительное участие в биологических процессах: линолевая кислота омега6 линоленовая кислота омега3 арахидоновая кислота омега6 эйкозапентаеновая кислота омега3 докозагексаеновая кислота омега3 Полиненасыщенные жирные кислоты препятствуют развитию атеросклероза и снижают уровень триглицеридов липопротеидов низкой плотности в крови холестерина и его...
81472. Биосинтез жирных кислот, регуляция метаболизма жирных кислот 192.83 KB
  Источником углерода для синтеза жирных кислот служит ацетилКоА образующийся при распаде глюкозы в абсорбтивном периоде. Образование ацетилКоА и его транспорт в цитозоль. Активный гликолиз и последующее окислительное декарбоксилирование пирувата способствуют увеличению концентрации ацетилКоА в матриксе митохондрий. Так как синтез жирных кислот происходит в цитозоле клеток то ацетилКоА должен быть транспортирован через внутреннюю мембрану митохондрий в цитозоль.
81473. Химизм реакций β-окисления жирных кислот, энергетический итог 170.76 KB
  βОкисление специфический путь катаболизма жирных кислот при котором от карбоксильного конца жирной кислоты последовательно отделяется по 2 атома углерода в виде ацетилКоА. Реакции βокисления и последующего окисления ацетилКоА в ЦТК служат одним из основных источников энергии для синтеза АТФ по механизму окислительного фосфорилирования. связаны макроэргической связью с коферментом А: RCOOH HSKo АТФ → RCO КоА АМФ PPi. Реакцию катализирует фермент ацилКоА синтетаза.
81474. Биосинтез и использование кетоновых тел в качестве источников энергии 127.33 KB
  В результате скорость образования ацетилКоА превышает способность ЦТК окислять его. АцетилКоА накапливается в митохондриях печени и используется для синтеза кетоновых тел. Синтез кетоновых тел начинается с взаимодействия двух молекул ацетилКоА которые под действием фермента тиолазы образуют ацетоацетилКоА. С ацетоацетилКоА взаимодействует третья молекула ацетилКоА образуя 3гидрокси3метилглутарилКоА ГМГКоА.
81475. Пищевые жиры и их переваривание. Всасывание продуктов переваривания. Нарушение переваривания и всасывания. Ресинтез триацилглицеринов в стенке кишечника 106.8 KB
  Переваривание жиров происходит в тонком кишечнике однако уже в желудке небольшая часть жиров гидролизуется под действием липазы языка . Однако вклад этой липазы в переваривание жиров у взрослых людей незначителен. Поэтому действию панкреатической липазы гидролизующей жиры предшествует эмульгирование жиров. Переваривание жиров гидролиз жиров панкреатической липазой.
81476. Образование хиломикронов и транспорт жиров. Роль апопротеинов в составе хиломикронов. Липопротеинлипаза 106.5 KB
  Липиды в водной среде а значит и в крови нерастворимы поэтому для транспорта липидов кровью в организме образуются комплексы липидов с белками липопротеины. ЛП хорошо растворимы в крови не коалесцируют так как имеют небольшой размер и отрицательный заряд на поверхности. В лимфе и крови с ЛПВП на ХМ переносятся апопротеины Е апоЕ и СП апоСП; ХМ превращаются в зрелые . ХМ имеют довольно большой размер поэтому после приёма жирной пищи они придают плазме крови опалесцирующий похожий на молоко вид.
81477. Биосинтез жиров в печени из углеводов. Структура и состав транспортных липопротеинов крови 153.12 KB
  В жировой ткани для синтеза жиров используются в основном жирные кислоты освободившиеся при гидролизе жиров ХМ и ЛПОНП. Молекулы жиров в адипоцитах объединяются в крупные жировые капли не содержащие воды и поэтому являются наиболее компактной формой хранения топливных молекул. В гладком ЭР гепатоцитов жирные кислоты активируются и сразу же используются для синтеза жиров взаимодействуя с глицерол3фосфатом.
81478. Депонирование и мобилизация жиров в жировой ткани. Регуляция синтеза и мобилизации жиров. Роль инсулина, глюкагона и адреналина 107.09 KB
  Регуляция синтеза и мобилизации жиров. Какой процесс будет преобладать в организме синтез жиров липогенез или их распад липолиз зависит от поступления пищи и физической активности. Регуляция синтеза жиров.
81479. Основные фосфолипиды и гликолипиды тканей человека (глицерофосфолипиды, сфингофосфолипиды, гликоглицеролипиды, гликосфиголипиды). Представление о биосинтезе и катаболизме этих соединений 264.19 KB
  Функции гликосфинголипидов можно суммировать следующим образом: Взаимодействие между: клетками; клетками и межклеточным матриксом; клетками и микробами. Церамид служит предшественником в синтезе большой группы сфинголипидов: сфингомиелинов не содержащих углеводов и гликосфинголипидов. В распаде сфингомиелинов участвуют 2 фермента сфингомиелиназа отщепляющая фосфорилхолин и церамидаза продуктами действия которой являются сфингозин и жирная кислота Катаболизм гликосфинголипидов. Катаболизм гликосфинголипидов начинается с перемещения их...