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;

}


 

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

54706. Открываем новые земли 60 KB
  Цель игры: сплочение коллектива развитие эмпатии и сопереживания между детьми и учителями; приобретение опыта совместного прохождения препятствий и принятия групповых решений формирование доверительного отношения между участниками игрового процесса.
54707. Математический КВН «Остров сокровищ» 33.5 KB
  Математический КВН Остров сокровищ Конкурс Приветствие команд Команда Пираты Наш девиз: Возьмём соперников на абордаж Весь остров знаний будет наш Команда капитана Флинта Наш девиз: Мы всех пиратов обойдём И клад мы первыми найдём Мы фору соперникам быстро дадим И в КВНе непременно победим Команда Джека Воробья Наш девиз: Наш Джек всегда непобедим К победе быстро мы летим. Бойко Остров сокровищ Пират: О Есть у математики священный клад Рассказывал товарищам пират. Несметные богатства в нём заключены Мы непременно взять...
54708. Освітній округ – крок у майбутнє. Інноваційний проект 296 KB
  Провести маркетингове дослідження з метою вияву кількісноякісного складу потреб в освітніх послугах та систематизувати результати у вигляді Програми Маркетингова діяльність школи у наданні якісно нових освітніх послуг через роботу освітнього округу. Створити модель Профільна та допрофільна освіта округу № 7 м. Скласти план менеджменту діяльності освітнього округу на стратегічному та оперативному тактичному рівнях.
54709. Формування інноваційної освітньої культури 41 KB
  Отже актуальним є визначення та подолання суперечності між оновленням парадигми сучасної освіти переходом на новий тип гуманістичноінноваційної освіти який передбачає інноваційну діяльність всіх учасників навчальновиховного процесу і неготовністю значної частини вчителів до відповідних змін. Важливо визначити роль інноваційної діяльності в системі науковометодичної роботи вчителя і висвітлити процес формування інноваційної освітньої культури педагога на різних етапах навчальновиховного процесу. Інноваційна діяльність в системі...
54710. ДОПРОФІЛЬНА ОСВІТА В ОСНОВНІЙ ШКОЛІ – ЗАПОРУКА УСПІШНОСТІ ДІТЕЙ СТАРШОЇ ШКОЛИ 125 KB
  Допрофільна та профільна освіта учнів загальноосвітньої школи представляє собою органічну частину системи виховання молоді її підготовки до самостійного трудового життя. Професійна орієнтація є науково практичною системою підготовки учнів до вільного та свідомого вибору професії. Професійна інформація необхідна для учнів та передбачає засвоєння учнями конкретною сукупністю знань про соціальноекономічні та психофізичні умови правильного вибору професії. Допрофільне навчання засіб диференціації та індивідуалізації навчання коли за...
54711. Урок-круглий стіл «Освіта в Україні, Великобританії і США» 56 KB
  Schooling in Ukrine P1. s rule schooling in Ukrine begings t the ge of 6. The Ukrinin school system is orgnised into four levels: primry secondry higher nd postsecondry eduction Generl secondry eduction is compulsory. Primry nd secondry school hs three stges: primry bsic nd senior.
54713. Производственная функция. Совокупный, средний, предельный продукты 37.32 KB
  Производство есть процесс преобразования производственных ресурсов в готовую продукцию. Задача фирмы – наиболее эффективно использовать ресурсы, получить от них наибольшую отдачу
54714. Урок истории любви Отелло и Дездемон 39.5 KB
  Но сейчас в нашей школе иначе У доски Дездемона молчит. Всё ждал когда же выучит хоть интеграл И вновь держу кулак я наготове: Соседка справа вновь к уроку не готова И меры жёсткие пора уже принять: Всех кавалеров снова разогнать Чтоб Дездемоне двоек больше не видать Дездемона: Шагая поступью довольно смелой Явился в школу одноклассник мой Отелло. Отелло: Ах Дездемона а по свойски Дуся Второй уж год с тобой учусь я. От нежелания учиться все страдания Отелло: Одни наряды на уме И платье сшитое по моде под питона Так...