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;

}


 

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

53777. Розвиток національного театру («Березіль» Леся Курбаса та Харківський театр ім. І.Франка). Пєси В.Винниченка, М.Куліша, І. Дніпровського, І. Кочерги 104.5 KB
  Антоніна Куліш дружина митця у своїх мемуарах Спогади про Миколу Куліша завершених у 1953 році у Філадельфії детально виклала один із драматичних моментів його дитячих літ записаний зі слів письменника що засвідчує що мати його неодноразово била за брехню та інші провини. Чаплинські інтелігенти особливо енергійний шкільний вчитель Володимир Пилипович Губенко...
53778. Групи слів за значенням. Омоніми 103 KB
  Мета: поглибити знання учнів набуті у молодшій школі; навчити пятикласників знаходити в тексті омоніми; сприяти виробленню вмінь та навичок правильно використовувати різні за значенням групи слів в усному та писемному монологічному і діалогічному мовленні; за допомогою вправ різнотипного характеру розвивати творчі здібності логічне й образне мислення та мовлення спостережливість пам'ять логіку викладу думокуміння аналізувати експериментувати досліджувати й порівнювати мовний матеріал робити правильні...
53779. Незмінювані іменники 39.5 KB
  Мета: поглибити знання учнів про незмінювані іменники навчити визначати в них рід розвивати вміння вживати незмінювані іменники у звязному мовленні розвивати творче мислення виховувати бажання збагачувати свій лексикон. Лінгвістичний двобій Двоє учнів по черзі ставлять підготовлені вдома питання Яка частина мови називається іменником За чим змінюється іменник Як визначити рід іменника Які іменники належать до власних назв Як пишуться власні назви До якого роду належать назви осіб за професією чи...
53780. Общее укрепление мышечного тонуса, саморазвитие. Воспитание здоровой личности 96.5 KB
  Спина прямая руки прямые по возможности наклоны головы выполняем плавно дыхание ровное.сидя стоя на коленях на вдохе поднять руки вверх на выдохе опустить. 46 раз Следим за осанкой вдох должен быть глубоким руки опускаем плавно вниз выдох удлиненный с одновременным произнесением звуков.
53781. Решение задач. Поиск «лишнего» предмета в группе предметов 788.5 KB
  ЦЕЛЬ: повторить изученное; развивать у учеников внимание, логическое мышление, умение находить общие признаки для группы предметов, лишний предмет в группе предметов; продолжать формировать навыки работы с компьютером.
53782. Общий случай вычитания двузначных чисел с переходом через десяток. Решение задач 196 KB
  ОБОРУДОВАНИЕ: предметные рисунки с изображением сливы яблока и груши; сверток бумаги в виде указа; карта математической страны; аудиозапись сказки О рыбаке и рыбке; картинки с изображением Буратино Незнайки и Знайки совы. Буратино Показ предметного рисунка с изображением Буратино Правильно это Буратино а из какой он сказки Приключение Буратино Сейчас мы узнаем почему он плачет. Буратино потянулся Раз нагнулся два нагнулся Руки в стороны развел Видно ключик не нашел. Оказывается Буратино не может открыть тайную дверь.
53783. Чтение примеров на умножение. Название чисел при умножении. Составление таблицы умножения числа 2. Задачи на действие умножения 127.5 KB
  ЦЕЛЬ: упражнять детей в чтении и записывании примеров на умножение; учить заменять действие сложения одинаковых слагаемых действием умножения а действие умножения действием сложения; ознакомить с названиями компонентов при умножении; ознакомить с таблицей умножения числа 2; развивать математическую речь логическое мышление умение анализировать сопоставлять и делать выводы. Сегодня мы с вами продолжаем знакомиться с дествием умножения.
53784. Конспекти уроків з української літератури 117 KB
  Той хто перший виконав завдання намагається здобути більшу кількість балів. Урок гра âПерших 12 балівâ Відбіркове питання: записати залежно від обсягу починаючи з найменшого: новела роман вірш оповідання романепопея. 5 балів:: âКамяний хрестâ В. 6 балів: До інтимної лірики належить така поезія: Хто автор а âЯк я люблю оті години праціâ; б âГімнâ; в âІ всетаки до тебе думка линеâ; г âТричі являлась мені лю ...
53785. Конспекти уроків «Музичне мистецтво» 209 KB
  Заглибимося в далеке минуле і поміркуємо, як виник цей вид мистецтва. Можливо музика народилася від співу пташок або дзюрчання струмка, а може, - від ритмічної праці людини, магічних обрядів, або від слова, мелодійної мови людини? Це було дуже давно, і ми можемо лише припустити, як жила тоді первісна людина. Цікаво, що наштовхнуло її на винахід музичних інструментів?