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;

}


 

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

24414. Понятие тупика, характеристика отношений, возникающих в системе (граф запросов и разделения ресурсов).Способ определения наличия тупиковой ситуации в системе (редукция графа) 112 KB
  К основным законам и подзаконным актам регламентирующим деятельность в области защиты информации относятся: Законы Российской Федерации: О федеральных органах правительственной связи и информации от 19.95 № 15ФЗ; Об информации информатизации и защите информации от 20.95 N 170; О лицензировании деятельности предприятий учреждений и организаций по проведению работ связанных с использованием сведений составляющих государственную тайну созданием средств защиты информации а также с осуществлением мероприятий и или оказанием услуг по...
24415. Четыре условия возможности возникновения тупика 77 KB
  Политика безопасности. Процедуры управления безопасностью также важны как и политики безопасности. Если политики безопасности определяют что должно быть защищено то процедуры безопасности определяют как защитить информационные ресурсы компании. Нескольких важных процедур безопасности: 1.
24416. Факторы сложности восстановления систем после тупика 69 KB
  Эксплуатация инфраструктуры безопасности. Эксплуатация инфраструктуры безопасности. Если такое превышение имеет место значит данная строка это одна из первоочередных целей разработки политики безопасности. Если интегральный риск превышает допустимое значение значит в системе набирается множество мелких огрешностей в системе безопасности которые в сумме не дадут предприятию эффективно работать.
24417. Описание формальной модели ОС для абстрактной микропроцессорной ЭВМ 155 KB
  Структуру ОС в t T можно представить с помощью графа Гt вершинами которого являются элементы Р={P0 Pn} множество процессов и множество ресурсов R={r0 rq} а ребра устанавливают связь между вершинами. ОС является динамически изменяемая система то некоторые элементы в моменты времени t1 t2 принадлежащие Т если t1≠t2 представляют структуру ОС в виде графа Гt1 и графа Гt2. Проследим изменения графа Гt отображая структуру ОС в любой момент времени t T. Определим множество Е как совокупность правил фиксирующих изменение структуры...
24419. Понятие ОС ЮНИКС. Основные преимущества, понятие процесса в ОС ЮНИКС, отличие от предыдущих ОС 1.63 MB
  Система UNIX проектировалась как инструмент предназначенный для создания и отладки новых средств ПО. Эти идеи позволили применить UNIX не только на компьютерах с разной архитектурой но и предали этой ОС такую модульность и гибкость которая явилась основным фактором для расширения и развития самой системы. Основным преимуществом UNIX перед другими системами явилось следующее: Единый язык взаимодействия пользователя с системой вне зависимости от применяемой ЭВМ. При разработке UNIX авторы стремились совместить два несовместимых...
24420. Переадресация ввода/вывода и конвейер, зачем и почему 360.5 KB
  Процессор i486 обеспечивает механизм тестирования кеша используемого для команд и данных. Хотя отказ аппаратного обеспечения кеширования крайне маловероятен пользователи могут включить тестирование исправности кеша в число тестов выполняемых автоматически при включении питания. Примечание: Механизм тестирования кеша уникален для процессора i486 и может не поддерживаться в точности следующими версиями процессоров данной линии. При выполнении тестирования кеша само кеширование должно быть отключено.
24421. Файловая структура ОС ЮНИКС. Основное отличие и преимущество 458 KB
  Структура буфера TLB. Регистры и операции проверки буфера TLB. Структура буфера TLB . Ассоциативный буфера трансляции TLB кеш используемый для трансляции линейных адресов в физические.
24422. Координатор МАКЕ и система управления исходным кодом SCCS 110.5 KB
  Описание взаимозависимостей содержит команды которые должны быть выполнены если обнаружится что некоторый модуль устарел перестал соответствовать действительности. Такие команды обеспечивают реализацию всех необходимых для модернизации модуля действий. В одних системах интерпретатор прост но совокупность команд не образует язык программирования а в других имеются отличные языки программирования на уровне системных команд но выполнение отдельной команды осложнено. Контрольная точка задается для конкретной формы доступа к памяти...