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


 

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

21702. ОБЪЕКТЫ ТРЕТЬЕГО ПОРЯДКА 491.5 KB
  2} Итак с помощью объектов 2го порядка мы можем изменять состояния различных объектов 1го порядка.1 В него мы введём дополнительный объект 1го порядка изменение состояния которого через универсальный интерфейс отражается на остальных объектах 1го порядка. Введём также генератор случайности дающий возможность случайно выбрать какой объект 1го порядка следует изменить наиболее сильно и в каком направлении.
21703. Модели представления знаний 96 KB
  Впервые была представлена Минским как попытка построить фреймовую сеть или парадигму с целью достижения большего эффекта понимания . Минский разработал такую схему в которой информация содержится в специальных ячейках называемых фреймами объединенными в сеть называемую системой фреймов .Возможно б что вы используете информацию содержащуюся в вашем фрейме комнаты для того чтобы распознать мебель что называется процессом сверхувниз или в контексте теории фреймов фреймодвижущим распознаванием . Он предложил систему ...
21704. Модуль Нейрокибернетика 380 KB
  В первом случае сформированная нейронная сеть выступает в роли регрессионной модели и имеет k входов и один выход то есть в качестве входных значений нейронной сети выступают предшествующие значения котировок а в качестве выхода значение на текущий момент. В автоматическом управлении нейронные сети так же не плохо справляются со своей задачей и если учесть что не нужно проводить сложных расчетов то выбор в пользу использования нейронных сетей становиться очевидным. Так же нейронные сети находят практическое применение при диагностике...
21705. Технология личностного ориентирования в географии 103.5 KB
  Содержание личностно-ориентированного образования, его средства и методы структурируются так, что позволяют ученику проявить избирательность к предметному материалу, его виду и форме, в этих целях разрабатываются индивидуальные программы обучения, которые моделируют исследовательское мышление.
21706. Методы экспертного оценивания 136 KB
  5] Анализ компетентности экспертов по взаимооценкам [0.6] Анализ компетентности экспертов по оценкам объектов [0. Типичные ситуации группового выбора: распределение конкурсной комиссией поощрений; обсуждение и согласование нескольких альтернативных законопроектов; ранжирование по перспективности внедрения образцов новых промышленных изделий производимое группой экспертов. Например для 3х объектов предпочтение одного из экспертов или он может количественно выразить интенсивность ; ; .
21707. Разделы модуля «Базовые понятия. Методы извлечения знаний» 368 KB
  Методы извлечения знаний [1] История и этапы развития искусственного интеллекта [2] Подходы к созданию систем искусственного интеллекта [3] Искусственный интеллект в России [4] Направления развития искусственного интеллекта [5] Основные определения [6] Методы извлечения знаний [7] Классификация методов извлечения знаний [8] Пассивные методы [9] Наблюдения [10] Анализ протоколов мыслей вслух [11] Лекции [12] Активные методы [13] Активные индивидуальные методы [14] Анкетирование [15] Интервью [16] Свободный диалог [17] Активные групповые методы...
21708. Модуль Жизненный цикл интеллектуальной системы 147.5 KB
  2] Этап 2: Разработка прототипной системы [1.4] Этап 4: Оценка системы [1.5] Этап 5: Стыковка системы [1.
21709. Модуль Методы представления знаний: Нечеткая логика 192 KB
  Математический аппарат Характеристикой нечеткого множества выступает функция принадлежности Membership Function. Обозначим через MFcx – степень принадлежности к нечеткому множеству C представляющей собой обобщение понятия характеристической функции обычного множества. Значение MFcx=0 означает отсутствие принадлежности к множеству 1 – полную принадлежность. Так чай с температурой 60 С принадлежит к множеству 'Горячий' со степенью принадлежности 080.