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;

}


 

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

36145. Анатомия. Общие вопросы 1.84 MB
  Знание морфофункциональных особенностей организма ребенка особенно важно так как именно как в период его становления при неправильной организации условий жизни и обучения особенно быстро возникают различные патологические нарушения функций нервной системы опорнодвигательного аппарата сердечно сосудистой системы и др. В образовании каждого органа участвуют различные ткани но одна из них является главной ведущей рабочей мозг нервная ткань. Аристотель различал у животных сухожилия и нервы кости и хрящи. Клавдий Гален описал 7 пар из...
36146. Сердечно-сосудистая система. Шпора 279.5 KB
  Артерии располагаются по ходу нервной трубки и нервов. Кроме того артерии первоначально закладываются в связи с главными нервами: например на верхней конечности в связи с n. Соответственно делению организма на органы растительной и животной жизни артерии делятся на париетальные к стенкам полостей тела и висцеральные к содержимому их т. Артерии туловища сохраняют сегментарное строение: aa.
36147. Внутренние органы 373.5 KB
  Нижняя поверхность языка свободна только в передней части; задняя часть занята мышцами. Три части: pars nasalis pars oralis и pars laryngea. В шейной части пищевода мышцы поперечнополосатые в верхнем отделе грудной части они смешанного типа нижней трети гладкие. Топография 3 части: 1шейную; 2грудную; 3брюшную.
36148. Железы внутренней секреции 61.5 KB
  Эндокринными железами endo внутрь crino выделяю или железами внутренней секреции называются такие железы которые не имеют выводного протока беспроточные железы glandulae sine ductibus и свой секрет выделяют непосредственно в кровеносную систему в противоположность железам внешней секреции секрет или экскрет которых изливается на поверхность кожи потовые сальные железы или слизистых оболочек слюнные железы печень и т. Так как выделение секрета совершается в кровеносную систему то эндокринные железы обладают широко развитой...
36149. Государственный Русский музей 28 KB
  Филиалы музея расположены в Михайловском замке в Мраморном и Строгановском дворце. В ведении музея находятся также Михайловский и Летний сад с Летним дворцом Петра I а также Домик Петра I. Директор музея Владимир Александрович Гусев. К моменту открытия музея его коллекция насчитывала около четырехсот полотен.
36150. Государственный Русский музей. История создания музея 642.71 KB
  История создания музея В исторической канве хронологических событий культурной жизни России существуют явления имеющие непреходящее значение. К таким несомненно относится учреждение и открытие Русского музея. Идея организации государственного музея национального искусства высказывалась и обсуждалась в образованной среде русского общества с середины XIX века. Уже в конце 1880х годов перед российским обществом встал вопрос о необходимости создания музея русского национального искусства как того требует современное процветание русского...
36151. Маршрут по Русскому музею (библейские сюжеты) 2.23 MB
  Семирадский Въезд Иисуса Христа в Иерусалим 1876 г. Увидев это Симон Петр припал к коленям Иисуса и сказал: выйди от меня Господи потому чтоя человек грешный. И сказал Симону Иисус: не бойся; отныне будешь ловить человеков. Государственный Русский музей СанктПетербург не представлена данная картина Тогда Пилат взял Иисуса и велел бить Его.
36152. Русский музей. Древние Иконы 4.12 MB
  3 часть самостоятельной работы Деятели 2ой половины XIX 1 Портрет И. 1872 К 1872 году времени написания портрета имя Ивана Сергеевича Тургенева было знаменито по всей России. Со осознанием свое ответственности Василий Перов Исполнял заказ Павла Третьякова задумавшего в своей московской галерее собрать портреты лучших людей России. Портрет Тургенева композиционно мастерски построен.
36153. История создания русского музея 21.96 KB
  К таким несомненно относится учреждение и открытие Русского музея. Идея организации государственного музея национального искусства высказывалась и обсуждалась в образованной среде русского общества с середины XIX века. Уже в конце 1880х годов перед российским обществом встал вопрос о необходимости создания музея русского национального искусства как того требует современное процветание русского искусства и высокое положение занимаемое Россиею в образованном мире Записка обергофмаршала князя С.