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;

}


 

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

24878. Влияние структуры капитала на рентабельность собственных средств и стоимость обыкновенных акций 32.5 KB
  Первая концепция финансового рычага. Эффект финансового рычага DFL это увеличение чистой рентабельности собственного капитала за счет использования предприятием заемных средств несмотря на платность последних. Величину DFL можно рассчитать по следующей формуле: DFL = [D E ] х [ ROA i] х [1 t] Где t ставка налога на прибыль; E собственные средства предприятия; D заемные средства ROA рентабельность активов; Соотношение заемных и собственных средств носит название плечо финансового рычага разница между экономической...
24879. Влияние структуры капитала на стоимость компании 32.5 KB
  Кроме теории структуры капитала МодильяниМиллера существует традиционный подход к этой проблеме. Он ориентирован на то что цена капитала зависит от его структуры и что существует оптимальная структура капитала. Исследования показали что с ростом доли заемных средств в общей сумме источников долгосрочного капитала цена собственного капитала постоянно увеличивается возрастающими темпами а цена заемного капитала оставаясь сначала практически неизменной затем тоже начинает возрастать.
24880. Гудвилл: трактовка, оценка, отражение в отчётности 30.5 KB
  Применительно к бизнесу гудвилл это положительное отношение потребителя товаров или услуг к их производителю обусловленное высоким качеством предлагаемых товаров услуг удобным месторасположением предприятия качественным обслуживанием.В приложении к конкретном предприятию принято выделять два вида гудвилла внутренне созданный и приобретенный. Любое спешно функционирующее предприятие должно иметь положительный внутренний гудвилл.
24881. Дивидендная политика и её влияние на рыночную капитализацию компании 35.5 KB
  Модильяни и Миллер исследовали взаимосвязь дивидендной политики и стоимости предприятия в идеальных условиях. Поэтому на совершенном рынке дивидендная политика не влияет на стоимость предприятия и благосостояние собственников. Преимущества: наличие непосредственно взаимосвязи дивидендных выплат с финансовым результатом деятельности предприятия.
24882. Доходный подход в оценке стоимости бизнеса 27.5 KB
  В рамках данного подхода стоимость предприятия рассматривается как текущая стоимость будущих доходов которые предприятие способно принести своему владельцу. В качестве показателей доходов в расчетах могут использоваться следующие показатели: прибыль; дивидендные выплаты; денежные потоки; экономическая добавленная стоимость и другие. Мостаточная стоимость.
24883. Интеллектуальные ресурсы. Амортизация интеллектуальных ресурсов 28.5 KB
  Амортизация интеллектуальных ресов. Амортизация интеллектуальных ресурсов. Нематериальные активы стоимость которых уменьшается с течением времени и амортизация по ним начисляется исходя из срока их полезного использования. Нематериальные активы по котором не проводится погашение стоимости и амортизация не начисляется.
24884. Интеллектуальная собственность. Оценка и нормативно-правовая база 28 KB
  Понятие интеллектуальная собственность определено международным правовым актом т. В конвенции дана следующая формулировка интеллектуальной собственности Интеллектуальная собственность включает права относящиеся к: Литературным художественным и научным произведениям. В соответствии с ГК РФ интеллектуальная собственность определена как самостоятельный объект гражданских прав по которым установлен жесткий режим защиты.
24885. Использование САРМ в оценке финансовых активов 27.5 KB
  Кs = Кrf Км Кrf β Кs цена обыкновенных акций как источник финансирования. Кrf безрисковая доходность ценных бумаг. Км Кrf рыночная премия за риск.
24886. Ключевые факторы в управлении стоимостью 30.5 KB
  Назовем их ключевыми факторами стоимости. Вовторых именно эти факторы стоимости помогают менеджерам высшего эшелона понять что происходит на всех остальных уровнях организации и донести до них свои планы и намерения. Фактор создания стоимости в данном случае это некая характеристика деятельности от которой зависит результативность функционирования предприятия. Для правильного определения факторов создания стоимости требуется соблюдать три важных принципа: 1.