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;

}


 

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

79233. Уклонение гражданина от уплаты налогов 33.74 KB
  Непосредственный объект преступления отношения регулирующие налогообложение физических лиц. Предметом преступления являются налоги и или сборы которые обязано уплатить физическое лицо в соответствии с законом. Объективная сторона преступления может выражаться в действии во внесении в декларацию заведомо искаженных сведений о доходах и расходах; в бездействии в непредставлении декларации о доходах когда она в обязательном порядке должна представляться в налоговые органы. Состав преступления материальный преступление считается...
79234. Убийство с отягчающими обстоятельствами 37.57 KB
  Такое убийство совершается либо в процессе осуществления потерпевшим своей служебной деятельности либо как акт мести за такую деятельность.
79235. Убийство в состоянии аффекта 33.09 KB
  Объективная сторона данного преступления образует лишение жизни другого человека совершенное в состоянии внезапно возникшего сильного душевного волнения аффекта вызванного насилием издевательством или тяжким оскорблением со стороны потерпевшего либо иными противоправными или аморальными действиями бездействием потерпевшего а равно длительной психотравмирующей ситуацией возникшей в связи с систематическим противоправным или аморальным поведением потерпевшего. Данное убийство является ответной реакцией виновного на противоправное...
79236. Экономическая система Дж. КЕйнса (1883-1946) и ее значение для развития мировой экономической мысли 318 KB
  Книга озаглавлена так для того чтобы мои аргументы и выводы противопоставить аргументам и выводам классической1 теории на которой я воспитывался и которая как и 100 лет назад господствует над практической и теоретической экономической мыслью правящих и академических кругов нашего поколения. Я приведу доказательства того что постулаты классической теории применимы не к общему а только к особому случаю так как экономическая ситуация которую она рассматривает является лишь предельным случаем возможных состояний равновесия. ГЛАВА 2...
79237. Неолиберализм. Монетаризм как альтернатива кейнсианству 347 KB
  Оптимальное количество денег В теории денег есть нечто напоминающее японский сад. Стало распространенным утверждение что в теории денег нет ничего менее существенного чем их количество выраженное в долларах фунтах или песо. Действительно если бы единицей счета вместо доллара стал вдруг цент то нам пришлось бы просто умножить количество денег на 100 как и все другие номинальные величины цены активы обязательства; но никаких других эффектов в экономике это не вызвало бы. Совсем иначе обстоит дело с количеством денег в реальном...
79238. Институционализм как идейно-теоретическая база либерального реформизма 181 KB
  И эта основа становится менее прочной как раз тогда когда высокий уровень издержек и длительный период созревания изделий обусловленные современной техникой требуют значительно большей надежности рынков. Назначение книги ОСНОВУ книги составляют три статьи Природа фирмы 1937 Спор о предельных издержках 1946 и Проблема социальных издержек 1960. Чтобы объяснить почему фирмы существуют и что именно они делают я счел необходимым ввести понятие которое я в этой статье обозначил как издержки использования механизма цен издержки...
79239. Экономическая мысль периода генезиса капитализма: меркантилизм как первая концепция рыночных отношений. Экономическая система физиократов 177.5 KB
  Нация распадается на три класса граждан: класс производительный класс собственников и класс непроизводительный. Непроизводительный класс состоит из всех граждан которые заняты другими услугами и видами труда кроме земледелия и затраты которых оплачиваются производительным классом и классом собственников в свою очередь получающим свои доходы от производительного класса. Экономическая таблица охватывает три указанных класса и ежегодно получаемое ими богатство и описывает обмен commerce между ними в следующей форме. Класс собственников...
79240. Классическая политическая экономия. Экономические системы А. Смита (1723-1790) и Д. Рикардо (1772 - 1823 гг.) 152 KB
  Годичный труд каждого народа представляет собою первоначальный фонд который доставляет ему все необходимые для существования и удобства жизни продукты потребляемые им в течение года и состоящие всегда или из непосредственных продуктов этого труда или из того что приобретается в обмен на эти продукты у других народов. Напротив у народов цивилизованных и процветающих хотя у них большое число людей совсем не работает причем многие неработающие потребляют в десять а часто и в сто раз большего труда чем...
79241. Идеи классической политической экономии в учениях Т. Мальтуса, Ж.-Б. Сэя., Дж. Ст. Милля 192.5 KB
  Это обстоятельство а также внимание оказанное обществом моему Опыту обязывали меня произвести некоторые исторические исследования с целью изучить влияние закона народонаселения на прошедшее и настоящее состояния общества. Нищета и бедствия производимые чрезмерно быстрым размножением населения бы ли уже замечены и жестокие меры против этих бедствий были указываемы со времен Платона и Аристотеля. Не говоря уже о том что сравнение между возрастанием населения и средств потребления не было никем изложено с достаточной силой и ясностью...