67363

Перехоплення всіх винятків

Лекция

Информатика, кибернетика и программирование

Часто доцільно використовувати настанову catch(...) як останній «рубіж» catch-послідовності. У цьому випадку вона забезпечує перехоплення винятків усіх інших типів (тобто не передбачених попередніми catch-виразами). Наприклад, розглянемо ще одну версію попереднього коду програми...

Украинкский

2014-09-07

78.5 KB

0 чел.

Лекція № 24

Тема: Перехоплення всіх винятків

  Іноді варто створити спеціальний обробник для перехоплення всіх винятків, а не винятків тільки певного типу. Для цього достатньо використовувати такий формат catch-блоку:

catch(...)

{

    // Оброблення всіх винятків

}

   У цьому записі занесені в круглі дужки крапки забезпечують збіг з будь-яким типом. Використання формату catch(...) продемонстровано в такому коді програми.

Приклад. Демонстрація механізму перехоплення винятків усіх типів

 

void Xhandler(int test)

{

 try

{

 if(test == 0) throw test; // Генерує int-винятки

 if(test == 1) throw 'a'; // Генерує char-винятки

 if(test == 2) throw 123.23; // Генерує double-винятки

}

 catch(...)

           {    // Перехоплення всіх винятків

 cout << "Перехоплення!" << endl;

}

}

void main()

{

cout << "Початок" << endl;

Xhandler(0);

Xhandler(1);

Xhandler(2);

cout << "Кінець програми";

}

   Внаслідок виконання ця програма відображає на екрані такі результати:

Початок.

Перехоплення!

Перехоплення!

Перехоплення!

Кінець програми

    Як бачите, всі три throw-винятки перехоплені за допомогою однієї catch-настанови.

    Часто доцільно використовувати настанову catch(...) як останній "рубіж" catch-послідовності. У цьому випадку вона забезпечує перехоплення винятків усіх інших типів (тобто не передбачених попередніми catch-виразами). Наприклад, розглянемо ще одну версію попереднього коду програми, у якій безпосередньо забезпечується перехоплення винятків цілочисельного типу, а перехоплення усіх інших можливих винятків здійснюється за допомогою настанови catch(...).

Приклад. Демонстрація механізму використання настанови catch(...) для перехоплення

                 винятків усіх інших типів

 

void Xhandler(int test)

{

 try

{

 if(test == 0) throw test; // Генерує int-винятки

 if(test == 1) throw 'a'; // Генерує char-винятки

 if(test == 2) throw 123.23; // Генерує double-винятки

}

 catch(int c)

{ // Перехоплює int-винятки

 cout << "Перехоплення " << c << endl;

}

catch(...)

{ // Перехоплює усі інші винятки

 cout << "Перехоплення-перехоплення!" << endl;

}

}

void main()

{

cout << "Початок" << endl;

Xhandler(0);

Xhandler(1);

Xhandler(2);

cout << "Кінець програми";

}

   Внаслідок виконання ця програма відображає на екрані такі результати:

Початок.

Перехоплення 0

Перехоплення-перехоплення!

Перехоплення-перехоплення!

Кінець програми

   Як підтверджує цей приклад, використання формату catch(...) як "останнього рубежу" catch-послідовності – це зручний спосіб перехопити всі винятки, які інколи не хочеться обробляти безпосередньо. Окрім цього, перехоплюючи абсолютно всі винятки, Ви запобігаєте можливості аварійного завершення роботи коду програми, яке може бути викликане якимсь непередбаченим (а значить, необробленим) винятком.

Тема: Обмеження виняткових ситуацій

   Існують засоби, які дають змогу обмежити тип винятків, котрі може генерувати функція за межами свого тіла. Можна також захистити функцію від генерування будь-яких винятків взагалі. Для формування цих обмежень необхідно внести у визначення функції throw-вираз.

  

   Загальний формат визначення функції з використанням throw-виразу має такий вигляд:

тип ім'я_функції (перелік_аргументів) throw (перелік_імен_типів)

{

//...

}

   У цьому записі елемент перелік_імен_типів повинен містити тільки ті імена типів даних, які дозволяється генерувати функції (елементи списку розділяються між собою комами). Генерування винятку будь-якого іншого типу призведе до аварійного завершення роботи коду програми. Якщо потрібно, щоби функція взагалі не могла генерувати винятки, то як цей елемент використовують порожній перелік.

  При спробі згенерувати винятки, які не підтримуються функцією, викликається стандартна бібліотечна функція abort(), яка забезпечує аварійне завершення роботи коду програми. Але при бажанні можна задати власний обробник процесу її завершення.

   На прикладі наведеної нижче програми показано, як можна обмежити типии винятків, які здатна генерувати функція.

Приклад. Демонстрація механізму накладання обмежень на тип винятків, які

                 генеруються функцією

 

    // Ця функція може генерувати винятки тільки типу int, char і double.

void Xhandler(int test) throw (int, char, double)

{

if(test == 0) throw test;              // Генерує int-винятки

if(test == 1) throw 'a';                // Генерує char-винятки

if(test == 2) throw 123.23;        // Генерує double-винятки

}

  

void main()

{

cout << "Початок" << endl;

try

{

 Xhandler(0);      // Спробуйте також передати функції Xhandler() аргументи 1 і 2.

}

 catch(int c)

   { cout << "Перехоплення int-винятку" << endl; }

 catch(char c)

   { cout << "Перехоплення char-винятку" << endl; }

 catch(double d)

   { cout << "Перехоплення double-винятку" << endl; }

cout << "Кінець програми";

}

   У цьому коді програми функція Xhandler() може генерувати винятки тільки типу int, char і double. При спробі згенерувати винятки будь-якого іншого типу відбудеться аварійне завершення роботи коду програми (завдяки виклику функції unexpected()). Щоб переконатися у цьому, видаліть з throw-списку, наприклад, тип int і перезапустіть заново програму.

   Важливо розуміти, що діапазон винятків, дозволених для генерування функції, можна обмежувати тільки типами, які вона генерує в try-блоці, звідки була викликана. Іншими словами, будь-який try-блок, розташований в тілі самої функції, може генерувати винятки будь-якого типу, якщо вони перехоплюються в тілі тієї ж самої функції. Обмеження застосовується тільки для ситуацій, коли "викид" винятків відбувається за межі функції. Наступна зміна завадить функції Xhandler() генерувати будь-які зміни.

 

  // Ця функція взагалі не може генерувати винятки!

void Xhandler(int test) throw ()

{

     /* Наведені нижче настанови більше не працюють.

         Тепер вони можуть викликати тільки аварійне завершення роботи коду програми*/

      if(test == 0) throw test;

      if(test == l) throw 'a';

      if(test == 2) throw 123.23;

}


 

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

81525. Генетическая гетерогенность. Полиморфизм белков в популяции человека (варианты гемоглобина, гликозилтрансферазы, группоспецифических веществ и др) 107.01 KB
  Группы крови. Другой важный пример полиморфизма белков связанный с проблемой переливания крови существование в популяции людей 3 аллельных вариантов гена фермента гликозилтрансферазы А В и 0. Антитела к антигенам А и В обычно имеются в сыворотке крови людей на поверхности эритроцитов которых отсутствует соответшвующий антиген т. индивидуумы с антигенами А на поверхности эритроцитов продуцируют в сыворотку крови антитела к Вантигенам антиВ а люди с Вантигенами антитела к антигенам А антиА.
81526. Биохимические основы возникновения и проявления наследственных болезней (разнообразие, распространение) 104.52 KB
  За этой группой следуют белки модулирующие функции белков и участвующие в правильном сворачивании полипептидных цепей. Хорошо изученными наследственными заболеваниями связанными с нарушением синтеза α или βцепей НЬ являются талассемии. Синтез α и βцепей в норме регулируется таким образом что все молекулы протомеров используются на синтез тетрамера α2β2 Талассемии возникают как результат мутаций включающих замены или делеции одного или нескольких нуклеотидов а иногда и целого гена кодирующего структуру одного из протомеров....
81527. Основные системы межклеточной коммуникации: эндокринная, паракринная, аутокринная регуляция 100.4 KB
  По расстоянию от клетки продуцента гормона до клеткимишени различают эндокринный паракринный и аутокринный варианты регуляции. Клеткимишени могут отстоять от эндокринной клетки сколь угодно далеко. Пример: секреторные клетки эндокринных желёз гормоны из которых поступают в систему общего кровотока. Примеры: эндотелины вырабатываемые клетками эндотелия и воздействующие на эти же эндотелиальные клетки; Тлимфоциты секретирующие интерлейкины имеющие мишенями разные клетки в том числе и Тлимфоциты.
81528. Роль гормонов в системе регуляции метаболизма. Клетки-мишени и клеточные рецепторы гормонов 106.94 KB
  Клеткимишени и клеточные рецепторы гормонов Роль гормонов в регуляции обмена веществ и функций. Физиологический эффект гормона определяется разными факторами например концентрацией гормона которая определяется скоростью инактивации в результате распада гормонов протекающего в основном в печени и скоростью выведения гормонов и его метаболитов из организма его сродством к белкампереносчикам стероидные и тиреоидные гормоны транспортируются по кровеносному руслу В комплексе с белками количеством и типом рецепторов на поверхности...
81529. Механизмы передачи гормональных сигналов в клетки 98.08 KB
  По механизму действия гормоны можно разделить на 2 группы. К первой группе относят гормоны взаимодействующие с мембранными рецепторами пептидные гормоны адреналин а также гормоны местного действия цитокины эйкозаноиды. Вторая группа включает гормоны взаимодействующие с внутриклеточными рецепторами.
81531. Строение, синтез и метаболизм иодтиронинов. Влияние на обмен веществ. Изменение метаболизма при гипо- и гипертиреозе. Причины и проявление эндемического зоба 160.08 KB
  Биосинтез йодтиронинов. Из цистерн ЭР Тиреоглобулин поступает в аппарат Гольджи включается в состав секреторных гранул и секретируется во внеклеточный коллоид где происходит йодирование остатков тирозина и образование йодтиронинов. Йодирование тиреоглобулина и образование йодтиронинов осуществляется в несколько этапов Транспорт йода в клетки щитовидной железы. Образование йодтиронинов.
81532. Регуляция энергетического метаболизма, роль инсулина и контринсулярных гормонов в обеспечении гомеостаза 107.55 KB
  Абсорбтивный период характеризуется временным повышением концентрации глюкозы аминокислот и жиров в плазме крови. Изменения метаболизма в печени в абсорбтивном периоде После приёма пищи печень становится главным потребителем глюкозы поступающей из пищеварительного тракта. Почти 60 из каждых 100 г глюкозы транспортируемой портальной системой задерживается в печени. Увеличение потребления печенью глюкозы не результат ускорения её транспорта в клетки транспорт глюкозы в клетки печени не стимулируется инсулином а следствие ускорения...
81533. Изменения метаболизма при сахарном диабете. Патогенез основных симптомов сахарного диабета 115.42 KB
  При недостаточности содержания инсулинавозникает заболевание которое носит название сахарный диабет: повышается концентрация глюкозы в крови гипергликемия появляется глюкоза в моче глюкозурия и уменьшается содержание гликогена в печени. При введении инсулина больным диабетом происходит коррекция метаболических сдвигов: нормализуется проницаемость мембранмышечных клеток для глюкозы восстанавливается соотношение между гликолизом и глюконеогенезом. В связи с этим при инсулярной недостаточности и сохранении или даже повышении...