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;

}


 

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

27956. Самооценка и уровень притязаний как структурные элементы личности 18.81 KB
  Самооценка и уровень притязаний как структурные элементы личности. САМООЦЕНКА ценность значимость которой индивид наделяет себя в целом и отдельные стороны своей личности деятельности поведения. Самооценка выполняет регуляторную и защитную функции влияя на поведение деятельность и развитие личности ее взаимоотношения с другими людьми.
27957. Бихевиоризм и его значение в изучении поведения. Самообучающаяся и саморазвивающаяся организация как альтернатива традиционной модели организации 26.75 KB
  Самообучающаяся и саморазвивающаяся организация как альтернатива традиционной модели организации. Тогда здесь справедливы все требования предъявляемые к психологу работающему в области развития организации: психолог проектирует ситуацию в школе с целью обеспечить оптимальное выполнение ею своих функций. Самообучающаяся и саморазвивающаяся организация как альтернатива традиционной модели организации. САМООБУЧАЮЩАЯСЯ ОРГАНИЗАЦИЯ термин используемый в организационной теории для обозначения: 1 одной из моделей организации...
27958. Целостный подход в психологии. Основные направления современных социально-психологических прикладных исследований 21.38 KB
  ЦЕЛОСТНЫЙ ПОДХОД в психологии — совокупность принципов изучения психики, сознания и поведения как целостных феноменов. Разрабатывался с начала XX в., главным образом в школах целостной психологии, как антитеза господствовавшему ранее в психологической науке элементаристскому подходу (признает первичность элементов (частей) над целым, источник развития объектов
27959. Наблюдение и эксперимент. Классификация видов наблюдения и эксперимента 30.91 KB
  Эмпирические и теоретические предпосылки возникновения социальной психологии. Так в дифференциальной психологии и психологии личности эмпирические зависимости большей частью имеют статус корреляций т. в психологии заключается в том что исследователь зачастую оказывается включенным в ситуацию общения с обследуемым лицом испытуемым и может невольно повлиять на его поведение. Эмпирические и теоретические предпосылки возникновения социальной психологии.
27960. Деятельность, действие, операции. Комплекс возможностей образовательной среды как интегративный критерий её качества 24.13 KB
  Леонтьев Основные положения теории деятельности 1.Действия человека предметны; они реализуют социальные производственные и культурные цели принцип предметности человеческой деятельности и принцип ее социальной обусловленности. Психологическая теория деятельности начала разрабатываться в 20х начале 30х гг. Но главное состояло в том что авторы теории деятельности взяли на вооружение философию диалектического материализма теорию К.
27961. Соотношение внешней и внутренней деятельности 20.64 KB
  Соотношение внешней и внутренней деятельности. Интериоризацией называют как известно переход в результате которого внешние по своей форме процессы с внешними же вещественными предметами преобразуются в процессы протекающие в умственном плане в плане сознания; при этом они подвергаются специфической трансформации обобщаются вербализуются сокращаются и главное становятся способными к дальнейшему развитию которое переходит границы возможностей...
27962. Этапы развития психики в филогенезе: сенсорная психика, перцептивная психика, стадия интеллекта 26.14 KB
  Этапы развития психики в филогенезе: сенсорная психика перцептивная психика стадия интеллекта. Проблема возникновения психики в эволюции. С самого начала существует устойчивая связь психики ребёнка и психики матери.
27963. Функции и эмпирические характеристики сознания 344.54 KB
  Роль референтной группы в процессе социализации на различных онтогенетических этапах становления личности. Роль референтной группы в процессе социализации на различных онтогенетических этапах становления личности. Данная группа стандарт система отсчета для оценки себя и других служит ориентиром на разных этапах социализации ребёнка. В начале 70х годов ролевая концепция социализации функциональный подход которую отстаивают и активно развивают представители так называемой гуманитарной педагогики : Р.
27964. Системный подход к решению психофизиологической проблемы 26.99 KB
  идеи о функциональном единстве мозга и его связи с поведением и психикой начали возникать более 100 лет назад. В конце прошлого века в основном в русле клинической неврологии стали высказываться идеи о единстве функционирования частей мозга и связи этого единства с умственными возможностями человека. Он стойко придерживался взгляда что в коре мозга нет такого поля которое бы не принимало участия в осуществлении интеллектуальных функций [2]. Микросистемы сопоставимы с отдельными структурными образованиями мозга.