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;

}


 

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

34337. Производство аммиака и азотной кислоты 35 KB
  Производство аммиака и азотной кислоты В соответствии с принципом ЛеШателье при повышении давления и уменьшении температуры равновесие этой реакции смещается в сторону образования аммиака. Основным агрегатом установки для производства аммиака служит колонна синтеза Производство азотной кислоты: Азотная кислота одна из важнейших минеральных кислот. Такая смесь кипит без изменения концентрации кислоты. Современное производство азотной кислоты основано на процессах окисления аммиака и последующей переработке оксидов азота.
34338. Пр-во азотных мин.удобрений и их классификация 30.5 KB
  Прво азотных мин. Большинство азотных удобрений получают нейтрализацией кислот щёлочами.глубину потери – 225; поглощается по типу обменной адсорбции Карбамид мочевина 2NH3CO2=NH2COONH4= =CONH22H2O 2000C; 20 МПа 466 Лучшее удобрение для внекорневой подкормки растений Аммиачная селитра NH3HNO3=NH4NO3Q 3435 Закисляет почву гигроскопична слеживается взрывоопасна Сульфат аммония 2NH3H2SO4=NH42SO4Q 20521 Эффективен под орошаемые культуры рис хлопчатник Среди азотных удобрений самая большая массовая доля азота в...
34339. Фосфорная кислота 24 KB
  Н3РО4 безводная фосф кислота представляет собой бесцветное вещество плавящиеся при температуре 42. Однако на практике имеют дело с жидкой Н3РО4 что объясняется склонностью Н3РО4 к переохлаждению при темп 121С При небольшом переохлаждении она представляет собой густую сиропоподобную жидкость плотностью 188 г см^3 При нагревании водные растворы ортофосф кислоты теряют воду образуя пирафосфорная а затем метофосф кислота. Безводная ортофосф кислота очень агрессивна.
34340. Особенности производства калийных удобрений 29 KB
  Выделение хлористого калия из сильвинитовых руд может быть основано на различии механических физических или химических свойств составляющих компонентов. Переработка сильвинитов для получения хлористого калия по галургическому методу основана на физикохимических особенностях системы NCl КС1 Н2О. Эта особенность системы NCl КС1 Н2О используется для производства хлористого калия из сильвинитов по галургическому методу. Рационально построенная схема производства хлористого калия из сильвинита должна учитывать следующие технологические...
34341. Фосфорные минеральные удобрения 24 KB
  Фосфорные минеральные удобрения Фосф. К фосфорным удобрениям относятся простой и двойной суперфосфат принадлежащие к классу водорастворимых удобрений и комплексные удобрения. Фосфор вносят в почву и с помощью сложного удобрения аммофоса. Фосфорные удобрения получают как физическими так и химическими методами.
34342. Технология производства и экономическая эффективность выпуска и использования пластмасс 30.5 KB
  Технология производства и экономическая эффективность выпуска и использования пластмасс. Изделия из пластмасс наиболее часто получают методами горячего прессования литья под давлением экструзии выдувания обработки резанием. Прессование применяется главным образом для переработки термореактивных пластмасс. термореактивная смола переводится в плавкое состояние при котором и происходит вторая стадия процесса формование; затем происходит реакция поликонденсации и пластмасса отверждается становясь неплавкой и нерастворимой.
34343. Сырьевые материалы и основы производства резины 28 KB
  Резину изготавливают с помощью вулканизации. В результате вулканизации каучук превращается в прочную эластичную упругую массу – резину. В результате вулканизации молекулы каучука сливаются между собой дисульфидными мостиками в одну трехмерную макромолекулу. Большую роль играют так называемые ускорители вулканизации – органические соединения содержащие серу или азот меркаптобензтиазол дифенилгуанидин и др.
34344. Основные свойства и назначения природных и искусственных строительных материалов 21 KB
  Основные свойства и назначения природных и искусственных строительных материалов. Основные свойства строительных материалов можно разделить на несколько групп. К 1ой группе относятся физические свойства материалов: плотность и пористость. Ко 2й свойства характеризующие устойчивость материала к воздействию воды и низких температур: водопоглощение влажность влагоотдача гигроскопичность водопроницаемость водо морозостойкость.
34345. Классификация и свойства керамических материалов 21.5 KB
  Классификация и свойства керамических материалов Керамические строительные материалы – это искусственные каменные изделия получаемые из глиняных масс с добавками или без добавок других материалов путем формования и последующего обжига. Керамические материалы и изделия классифицируются по различным признакам. В зависимости от структуры керамические материалы разделяют на две основные группы: Плотные спекшиеся имеющие блестящий раковистый излом не пропускающие воду с водопоглощением менее 5 клинкерный кирпич для мощения дорог плитки для...