Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

18.2.2. Обмеження, що накладаються на тип винятків, які генеруються функціями

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

тип ім'я_функції (список_аргументів) throw (список_імен_типів)

{

//...

}

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

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

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

Код програми 18.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 == l) throw 'a'; // Генерує char-винятки

if(test == 2) throw 123.23; // Генерує double-винятки

}

int main()

{

cout << "Початок.\n";

try {

Xhandler(0); // Спробуйте також передати

// функції Xhandler() аргументи 1 і 2.

}

catch(int izm) { cout << "Перехоплення int-винятку.\n"; }

catch(char c) { cout << "Перехоплення char-винятку.\n"; }

catch(double d) { cout << "Перехоплення double-винятку.\n"; }

cout << "Кінець програми";

getch(); return 0;

}

У цій програмі функція 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;

}

Варто знати! На момент написання цього навчального посібника середовище Visual C++ не забезпечувало для функції заборону генерувати винятки, тип яких не задано в throw-виразі. Це свідчить про нестандартну поведінку даного середовища. Проте Ви все одно можете задавати те, що "обмежує" throw-вираз, але воно у цьому випадку відіграватиме тільки повідомне значення.