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;

}


 

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

77881. Авторское право 33 KB
  Авторское право. Функций: признание авторства на произведения науки литературы и искусства; установление режима использования произведений; наделение авторов и иных правообладателей личными и имущественными правами; защита данных прав. Субъекты: создатели произведений; работодатели; правопреемники; другие лица приобретшие права по закону или договору. Права автора: личные неимущественные права: право авторства; право на имя; право на обнародование; право на защиту репутации.
77882. Право на защиту чести, достоинства и деловой репутации 28.5 KB
  Диффамации которое распространяется на разглашение не только ложных но и действительных сведений позорящих честь и достоинство гражданина или юридического лица. Под распространением сведений следует понимать сообщение их различными способами как любому третьему лицу так и нескольким лицам неопределенному кругу лиц. При рассмотрении исков о защите чести и достоинства суду необходимо установить: имело ли место распространение сведений которые оспаривает истец; порочат ли они честь и достоинство истца; соответствуют ли они...
77883. Понятие, виды и исполнение обязательств в гражданском праве 28.5 KB
  Признаки обязательства: относительное гражданское правоотношение его субъектами являются строго определенные лица конкретный должник и конкретный кредитор; объектом обязательства является действие обязанного лица; содержанием являются права и обязанности сторон; опосредуют динамику гражданскоправовых правоотношений – процесс перехода имущественных благ от одних лиц к другим; за невыполнение наступает гражданскоправовая ответственность; 6 реализация кредитором своего права возможно только через исполнение обязанности...
77884. Поручительство и банковская гарантия как способы обеспечения исполнения обязательств 30.5 KB
  Поручительство и банковская гарантия как способы обеспечения исполнения обязательств Поручительство – способ по которому поручитель обязуется исполнить обязательство за должника. При поручительстве ответственным перед кредитором за неисполнение основного обеспечиваемого обязательства становится наряду с должником еще и другое лицо – поручитель...
77885. Залог как способ обеспечения исполнения обязательств 28 KB
  Общие признаки: носят имущественный характер то есть интересы кредитора удовлетворяются за счет имущества должника; направлены на обеспечение удовлетворения интересов кредитора которое состоит в надлежащем исполнении ему обязательства; между должником и кредитором чаще всего существует два обязательства; возникает на основании закона или договора...
77886. Понятие и виды гражданско-правовых договоров 28.5 KB
  Свобода договора: недопущение понуждения к заключению договора; свобода выбора партнера при заключении договора; свобода участников гражданского оборота в выборе вида договора; свобода усмотрения сторон при определении условий договора кроме условий которые предусмотрены законом. Значение договора: договор представляет собой одно из самых уникальных правовых средств в рамках которого интерес каждой стороны в принципе может быть удовлетворен лишь посредством удовлетворения интереса другой стороны; договор...
77887. Формы и способы заключения договоров. Содержание гражданско-правовых договоров 31.5 KB
  Содержание гражданскоправовых договоров Содержание договора – условия на которых достигнуто соглашение сторон: существенные – условия которые необходимы и достаточны для заключения договора. Во-первых являются условия о предмете договора. Они включаются в текст договора по усмотрению сторон. Однако в отличие от обычных они приобретают юридическую силу лишь в случае включения их в текст договора.
77888. Договор купли-продажи. Обязанности 35 KB
  Продавец обязан передать товар в собственность покупателю надлежащего качества количества комплектности со всеми документами и принадлежностями если отказывается то предоставляется разумный срок не передал – покупатель вправе отказаться от договора установленные законном или договором сроки пригодный для целей для которых товар такого рода обычно используется; товар свободный от 3 лиц либо уведомить покупателя об обременении данного товара....
77889. Договор дарения 30.5 KB
  Договор дарения Договором дарения называется договор по которому одна сторона даритель безвозмездно передает или обязуется передать определенное имущество другой стороне одаряемому либо освобождает или обязуется освободить ее от имущественной обязанности перед собой или перед третьим лицом. В отношении договоров дарения с участием юридических лиц ГК также предусматривает ряд специальных ограничений. Другое ограничение касается дарения вещей принадлежащих юридическому лицу на праве хозяйственного ведения или оперативного управления....