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


 

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

37295. Проект информационной системы Автоматизированная информационная система предприятия по изготовлению корпусной мебели «АИС Корпусная мебель» 2.91 MB
  Описание потоков данных и бизнес процессов. Описание потоков данных и бизнес процессов. Функциональный блок Изготовление частей изделия получает в качестве входных данных согласованный проект в управлении участвуют характеристики материалов методики изготовления ГОСТы по изготовлению мебели а также согласованный проект. В качестве выходных данных выступают части изделия готовые к сборке Рисунок 1.
37297. МЕТОД ПРОЕКЦИЙ. Центральные проекции и их основные свойства. 902.5 KB
  Перпендикуляр к плоскости перпендикулярен любой прямой проведенной в этой плоскости. Плоскости перпендикулярны если прямая принадлежащая одной плоскости перпендикулярна другой плоскости. Если прямая линия параллельна прямой лежащей в плоскости то она параллельна этой плоскости.
37298. Теория обучения и воспитания 481 KB
  Методические рекомендации и план освоения учебной дисциплины 13 Описание учебнометодического комплекса дисциплины Теория обучения и воспитания 15 Виды учебной работы 16 Тематический план курса 16 8. Задачи: Вооружить студентов системой научных знаний о сущности и особенностях процессов обучения воспитания и развития; Раскрыть потенциалы образовательной среды и ее возможные модификации для обеспечения качества образования; Активизировать развитие у студентов профессиональнопедагогического мышления умения видеть и анализировать...
37299. Перехідна характеристика об’єкта керування 101.5 KB
  Користуючись теоремою розкладення та стандартною функцією перетворення Лапласа розрахувати та побудувати перехідні характеристики об'єкта керування. Перехідну характеристику ht будуємо за допомогою стандартної операції зворотного перетворення Лапласа програмного середовища Mthcd. Спочатку знаходимо перетворення за Лапласом вихідної величини hp Задаємо початкові умови: Знайдемо перехідну функцію за допомогою теореми розкладення. Спочатку знаходимо перетворення за Лапласом...
37300. Общие требования к курсовой работе (для юридических дисциплин) 190 KB
  Структура и содержание курсовой работы Тема курсовой работы избирается студентом исходя из его интересов и согласовывается с научным руководителем. После утверждения темы студентом разрабатывается план работы который также должен быть согласован с научным руководителем. В дальнейшем при написании работы студенту рекомендуется обсуждать с руководителем наиболее принципиальные и спорные вопросы темы. Структура и содержание курсовой работы должны в полной мере раскрывать избранную тему.
37301. Физиология центральных и периферических эндокринных органов 57.54 KB
  Все процессы жизнедеятельности организма строго согласованы между собой по скорости, времени и месту протекания. В организме человека эту согласованность на периферии осуществляют внутриклеточные и межклеточные механизмы регуляции, важнейшую роль в которых играют гормоны.
37302. Инженерный анализ моделей технических систем с помощью MathCAD 72.5 KB
  Освоить программу MathCAD и получить практические навыки ее использования при инженерном анализе моделей технических систем.
37303. Провести анализ напряженно-деформированного состояния конструкции балочного типа с заданным поперечным сечением, при статическом нагружении 512 KB
  Ввод координат 2 Задание материала Для задания характеристик материала выберем пункт меню Model= Mteril Модель= Материал. Рисунок 2 Задание материала и его свойств Для сохранения введенного материала в библиотеке нажмем кнопку Sve ответив при этом утвердительно на запрос о подтверждении занесения Ст. Рисунок 3 Выбор типа конечных элементов Нажмем кнопку Shpe Форма для задания формы и размеров поперечного сечения балки. Рисунок 4 Задание формы поперечного сечения балки Выберем из списка Shpe сечение Chnnel C Section...