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


 

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

30872. Понятие о системах групп крови 45.5 KB
  Понятие о системах групп крови В настоящее время установлено что каждая клетка человеческого организма в том числе и эритроцит содержит на своей поверхности набор специфических белков Антигенов закрепленных генетически которые и обеспечивают её видовую и индивидуальную специфичность. Кроме антигенов существует и второй класс белков антитела к антигенам которые циркулируют в плазме крови и при взаимодействии с определенным антигеном расположенным на мембране клетки способны вызывать реакцию агглютинации образуя т....
30873. Понятие о гемостазе 47 KB
  Понятие о гемостазе Система гемостаза совокупность процессов направленных с одной стороны на предупреждение и остановку кровотечения а с другой на сохранение жидкого состояния циркулирующей крови. Задача поддержание адекватного состояния жидкостных характеристик крови. Плазменный собственно свертывание крови или гемокоагуляция обеспечивает остановку кровотечения из более крупных сосудов. Тромбоцитарный гемостаз: Тромбоциты Как лекоциты выполняют в основном защитную функцию так тромбоциты прежде всего участвуют в свертывании...
30874. Процесс свертывания крови 84.5 KB
  Процесс свертывания крови Гемокоагуляция собственно свертывание крови Основные положения теории свертывания крови А. Процесс свертывания крови стадийный. В современной теории свертывания крови различают 3 фазы свертывания: 1 фаза образование протромбиназного комплекса; 2 фаза образование тромбина; 3 фаза образование фибрина. Международный комитет по номенклатуре факторов свертывания крови обозначил плазменные факторы римскими цифрами в порядке хронологического открытия всего их по количеству тринадцать IXIII IIа ...
30875. Противосвертывающие факторы 26 KB
  Противосвертывающие факторы Противосвертывающая система обеспечивает поддержание крови в жидком состоянии. Механизмы обеспечивающие жидкое состояние крови: 1. В норме сосудистая стенка препятствует свертыванию крови: т. имеет одноименный электрический заряд с форменными элементами крови; адсорбирует активные факторы свертывания особенно тромбин; 2.
30876. Слуховой анализатор 29.5 KB
  Волоски рецепторных клеток омываются эндолимфой и покрыты текториальной покровной мембраной. Происходит деполяризация волосковых клеток и как следствие выделение медиатора ацетилхолин глютамат аспартат Воздействуя на постсинаптическую мембрану афферентного волокна который является дендритом ганглиозных нервных клеток спирального ганглия 1 нейрон. Аксоны этих нервных клеток несут звуковую информацию к кохлеарным ядрам слухового центра продолговатого мозга далее к верхним оливам ядрам латерального лемниска нижнему двухолмью...
30877. Биологическое значение боли 44 KB
  Болевые рецепторы ноцицепторы представляют собой свободные нервные окончания немиелинизированых волокон образующих сплетения в тканях кожи мышц некоторых органах. Ноцицепторы делятся на первый механоноцицепторы и второй хемоноцицепторы типы. Механоноцицепторы деполяризация происходит за счет механического смещения мембраны. Ноцицепторы кожи с афферентами Адельта волокон возбуждаются на механические стимулы почти не реагируют на термические раздражители и совсем не реагируют на химические раздражители.
30878. Условные рефлексы 44.5 KB
  Биологический смысл условного рефлекса Все условные рефлексы представляют одну из форм приспособительных реакций организма к изменяющимся условиям внешней среда это индивидуальная форма адаптации которая является более точной формой приспособления живых организмов к изменяющемуся окружающему миру. В процессе формирования условного рефлекса условный раздражитель приобретает СИГНАЛЬНЫЙ ХАРАКТЕР. УСЛОВНЫЙ РЕФЛЕКС помогает организму лучше приспосабливаться к действию БЕЗУСЛОВНОГО РАЗДРАЖИТЕЛЯ. Структурнофункциональной базой условного рефлекса...
30879. Корковое торможение 33.5 KB
  Сон и бодрствование Проявлением сна является понижение активности нервной системы выключение сознания понижение мышечного тонуса и всех чувств. Существует несколько видов сна: ежесуточный сезонный наркотический гипнотический патологический. Общая продолжительность суточного сна в среднем 7 8 часов в сутки. Активный сон по типу запредельного торможения В возникновении сна важную роль играют гипногенные структуры ствола мозга ретикулярная формация гипоталамус таламус.
30880. I и II сигнальные системы 48 KB
  система это система связей и ассоциаций в коре больших полушарий ответственная за восприятие натуральных раздражителей. система это система связей и ассоциаций в коре больших полушарий которая ответственна за восприятия смысла слова как раздражителя. Эта система сигнализации состоит в восприятии смысла слов слышимых произносимых и видимых. Эта система присуща только человеку.