Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Не підтверджено.doc
Скачиваний:
0
Добавлен:
07.01.2020
Размер:
3.08 Mб
Скачать
  1. Накладання обмежень на тип винятків, які генеруються функціями

Існують засоби, які дають змогу обмежити тип винятків, котрі може генеру­вати функція за межами свого тіла. Можна також захистити функцію від генеру­вання будь-яких винятків взагалі. Для формування цих обмежень необхідно внес­ти у визначення функції throw-вираз. Загальний формат визначення функції з ви­користанням throw-виразу має такий вигляд:

тип Ім'я_фунщ7(перелік_аргументів) throw (перепік_імен_типів)

{

II...

}

У цьому записі елемент перелік_імен_типів повинен містити тільки ті імена ти­пів даних, які дозволяється генерувати функції (елементи списку розділяються між собою комами). Генерування винятку будь-якого іншого типу призведе до аварійного завершення роботи коду програми. Якщо потрібно, щоби функція вза­галі не могла генерувати винятки, то як цей елемент використовують порожній перелік.

Bapmoa' нати! При спробі згенерувати винятки, які не підтримуються функцією, викликається стандартна бібліотечна функція unexpededQ. За за­мовчуванням вона викликає функцію abortQ, яка забезпечує аварійне завершення роботи коду програми. Але при бажанні можна задати власний обробник про­гресу її завершення. За подробицями необхідно звернутися до документації, що додається до Вашого компілятора.

На прикладі наведеної нижче програми показано, як можна обмежити типи винятків, які здатна генерувати функція.

Код програми 8.10. Демонстрація механізму накладання обмежень на тип винятків, які генеруються функцією #include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

// Ця функція може генерувати винятки тільки типу int, char і double, void Xhandler(int test) throw (int, char, double)

{

if(test == 0) throw test; // Генерує int-винятки if(test == I) throw 'a'; // Генерує char-винятки if(test == 2) throw 123.23; // Генерує double-винятки

}

Int mainO

{

cout«"Початок"« endl; try {

Xhandler(o); // Спробуйте також передати функції XhandlerO аргументи 1 і 2.

}

catch(int с) {cout «"Перехоплення int-винятку" « endl;} catch(charc) {cout«"Перехоплення char-винятку" « endl;} catch(double d) {cout«"Перехоплення double-винятку" « endl;} cout«"Кінець програми"; getchO; return 0;

}

У цьому коді програми функція XhandlerO може генерувати винятки тільки ти­пу int, char і double. При спробі згенерувати винятки будь-якого іншого типу відбу­деться аварійне завершення роботи коду програми (завдяки виклику функції unex- pectedO). Щоб переконатися у цьому, видаліть з throw-списку, наприклад, тип int і перезапустіть заново програму.

Важливо розуміти, що діапазон винятків, дозволених для генерування фун­кції, можна обмежувати тільки типами, які вона генерує в try-блоці, звідки була викликана. Іншими словами, будь-який try-блок, розташований в тілі самої фун­кції, може генерувати винятки будь-якого типу, якщо вони перехоплюються в тілі тієї ж самої функції. Обмеження застосовується тільки для ситуацій, коли "викид" винятків відбувається за межі функції.

Наступна зміна завадить функції XhandlerO генерувати будь-які зміни.

// Ця функція взагалі не може генерувати винятки!