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;

}


 

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

23399. Методи штучного інтелекту 326 KB
  підпис прізвище ____ _____________ 2011 року ЛАБОРАТОРНЕ ЗАНЯТТЯ № 9 з навчальної дисципліни __моделювання компютерних мереж напряму підготовки _______інформаційні технології________ освітньокваліфікаційного рівня ____cпеціаліст_____________ спеціальності _____ компютерні системи та мережі_________ Тема Методи штучного інтелекту повна назва лекції Лабораторне заняття №8 розроблено стар. вчена ступінь та звання прізвище та ініціали автора Обговорено на засіданні...
23400. Етапи моделювання систем 80 KB
  То же самое можно сказать и о моделировании. Конечный этап моделирования принятие решения на основании знаний об объекте. Цепочка выглядит следующим образом: Прототип объект процесс Моделирование Принятие решения Моделирование творческий процесс. Содержание этапов определяется поставленной задачей и целями моделирования.
23401. Системи і проблеми 267 KB
  Системы и проблемы. Методы системного анализа Понятие системы тесно связано с понятием проблемы. Любую проблему можно представить как отражение процесса функционирования реальной физической системы естественного или искусственного происхождения в которой при контролируемом входном воздействии создаваемая выходная реакция отличается от требуемой реакции. Первый из них связан с более глубоким познанием действующей системы и направлен на ее развитие эволюцию прежде всего в плане коррекции совершенствования общего процесса ее...
23402. Імітаційне моделювання 78 KB
  Етапи процесу побудови математичної моделі складної системи Формулируются основные вопросы о поведении системы ответы на которые мы хотим получить с помощью модели. Из множества законов управляющих поведением системы выбираются те влияние которых существенно при поиске ответов на поставленные вопросы. В пополнение к этим законам если необходимо для системы в целом или отдельных ее частей формулируются определенные гипотезы о функционировании. Трудности при построении математической модели сложной системы: Если модель содержит много...
23403. Імітаційне моделювання систем масового обслуговування 162.5 KB
  вчена ступінь та звання прізвище та ініціали автора Обговорено на засіданні кафедри ПМК Протокол № __________ ____ _____________ 2011 року Київ Навчальні цілі: Вивчення основних понять моделювання ознайомлення з поняттями системи та моделі співвідношенням між моделлю та системою класифікацією моделей видами моделей технологію моделювання; Виховні цілі: Формування у студентів інженернотехнічного кругозору методами імітаційного моделювання для побудови компютерних систем та мереж вміння ставити та вирішувати складні...
23404. Етапи розробки комп’ютерної імітаційної моделі системи 162 KB
  НАВЧАЛЬНОМАТЕРІАЛЬНЕ ЗАБЕЗПЕЧЕННЯ наочні посібники схеми таблиці ТЗН та інше Діапроектор дидактичні слайди НАВЧАЛЬНІ МАТЕРІАЛИ Етапи розробки імітаційної моделі системи Независимо от способа исходного описания исследуемой системы и внешней среды следует выделить следующие этапы создания ИМ в обобщенном виде представленные на рис. Составление содержательного описания объекта моделирования включая: определение объекта имитации как системы; определение целей моделирования; установление перечня количественных показателей эффективности...
23405. Мови та інструментальні засоби ІМ і CASE-технології 79 KB
  НАВЧАЛЬНОМАТЕРІАЛЬНЕ ЗАБЕЗПЕЧЕННЯ наочні посібники схеми таблиці ТЗН та інше Діапроектор дидактичні слайди НАВЧАЛЬНІ МАТЕРІАЛИ Універсальні мови високого рівня Современные ЭВМ вычислительные комплексы и сети являются мощными средствами исследования сложных систем с использованием технологий имитационного моделирования. Соответствующим образом осуществляется развитие и инструментальных программных средств обеспечивающих решение широкого спектра задач методами имитационного моделирования. Эти средства можно условно разделить на три...
23406. Імітаційне моделювання 87.5 KB
  Імітаційне моделювання це метод конструювання моделі системи та проведення експериментів. Термін моделювання відповідає англійському тобто побудова моделі та її аналізу. Перш за все слід подати в моделі структуру системи тобто загальний опис елементів і звязків між ними потім визначити засоби відтворення в моделі поведінки системи.Розроблення концептуальної моделі.
23407. Імітаційна модель ПК 77 KB
  Формування у студентів інженерно-технічного кругозору, методами імітаційного моделювання для побудови комп’ютерних систем та мереж, вміння ставити та вирішувати складні інженерні задачі, проводити аналіз, аргументовано робити висновки.