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;

}


 

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

33287. Функции налогов экономической системе 27 KB
  Налогам присущи 2 функции: Фискальная функция проявляется в обеспечении государства финансовыми ресурсами необходимыми для выполнения общенациональных потребностей. Через фискальную функцию государство обеспечивает: достижение баланса между доходами и расходами бюджета государства; равномерное распределение налоговых доходов по звеньям бюджетной системы; установление высокого уровня социальной инфраструктуры в государстве и в каждом отдельном регионе; выполнение всех экономических политических и социальных задач. Это обусловлено...
33288. Принципы налогообложения и их реализация в налоговой системе 26.5 KB
  Правило первое равномерность. Это правило требует чтобы граждане каждого государства принимали материальное участие в поддержании правительства. Часто данное правило называют принципом справедливости требующим чтобы обложение было достаточно жестким для богатых лиц и щадящим для социально слабозащищенных слоев населения. Второе правило определенность известность.
33289. Налоговое бремя экономики и бремя государства (их сущность и взаимосвязи) 30 KB
  субъект налога и носитель налога могут не совпадать. Налогоплательщик может стремиться к тому чтобы переложить налог либо âвпередâ на покупателей своих товаров повышая цену товаров в соответствии с размером налога либо âназадâ на людей у которых он сам покупает товары уплачивая им меньше чем если бы налога не существовало. Сфера применения личного подоходного налога как правило фокусируется на отдельных лицах чьи доходы облагаются налогом. В целом однако большинство экспертов сходятся во мнении что именно те лица...
33290. Налоговая политика: сущность и инструменты ее реализации 24.5 KB
  Налоговая политика: сущность и инструменты ее реализации. Налоговая политика комплекс мероприятий государства в области налогов осуществляемых органами власти и управления в соответствии с нормами налогового права. Налоговая политика является частью финансовой политики. В условиях высокоразвитых рыночных отношений налоговая политика используется государством для перераспределения НД в целях изменения структуры производства территориальноэкономического развития повышения уровня доходности отдельных групп населения.
33291. Налоговая система и этапы её становления в РФ 23.5 KB
  Налоговая система и этапы её становления в РФ Нал. право комплекс налоговых знов кот. и нал. органов права и обязти субъектов налх отношений т.
33292. Налоги, принятые и действовавшие в 90-е годы (до НК РФ) вопреки закону «Об основах налоговой системы в РФ», и их последствия 22 KB
  Налоги принятые и действовавшие в 90е годы до НК РФ вопреки закону Об основах налоговой системы в РФ и их последствия В декабре 1993 года президентским указом было отменено положение о норме в соответствии с которой региональные и местные органы власти в праве вводить или не вводить лишь те налоги которые оговорены законом âОб основах налоговой системы в Российской федерацииâ. В результате как грибы после дождя стали появляться такие экзотические налоги как налог на падение объемов производства или на инвестиции за...
33293. Система налогов и сборов в РФ и их классификация 23 KB
  В РФ устанавливаются следующие виды налогов и сборов: федеральные налоги и сборы налоги и сборы субъектов РФ и местные налоги и сборы. Федеральными признаются налоги и сборы устанавливаемые НК РФ и обязательные к уплате на всей территории РФ. Региональными признаются налоги и сборы устанавливаемые НК РФ и законами субъектов РФ вводимые в действие в соответствии с НК РФ законами субъектов РФ и обязательные к уплате на территориях соответствующих субъектов РФ. Местными признаются налоги и сборы устанавливаемые НК РФ и нормативными...
33294. Налоговая реформа и ее влияние на налоговую нагрузку организации 25 KB
  Налоговая реформа и ее влияние на налоговую нагрузку организации Принятый в России новый пакет законов о налогах впитал в себя мировой опыт что важно для выхода страны из экономической изоляции отвечает в основном требованиям переходного к рыночным отношениям периода имеет определенную социальную направленность. Важно сопоставить новую налоговую систему России с налогами действующими в разных зарубежных странах ибо переход к рыночной экономике немыслим без использования опыта западных государств наряду со всем лучшим что имелось в нашей...
33295. Методы расчета уровня налоговой нагрузки организации 25 KB
  Методы расчета уровня налоговой нагрузки организации. Налоговая нагрузка представляет собой обобщенную характеристику налоговой системы страны указывающую: вопервых на действие которое налоги оказывают на положение налогоплательщиков или на народное хозяйство в целом; вовторых количественную оценку этого действия. Как правило характеристика налоговой нагрузки определяющая действие налогов оказывающее на положение налогоплательщиков или на народное хозяйство в целом обусловлена наличием негативного отношения к налоговой...