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

18.2. Варіанти оброблення винятків

Крім розглянутих вище, існують і інші С++-засоби оброблення винятків, які створюють певні зручності для програмістів. Про них і піде мова у цьому розділі.

18.2.1. Перехоплення всіх винятків

Іноді варто створити спеціальний обробник для перехоплення всіх винятків, а не винятків тільки певного типу. Для цього достатньо використовувати такий формат catch-блоку:

catch(...) {

// Оброблення всіх винятків

}

У цьому записі занесена в круглі дужки багатокрапка забезпечує збіг з будь-яким типом даних.

Використання формату catch(...) продемонстровано в такій програмі.

Код програми 18.8. Демонстрація перехоплення винятків усіх типів

#include <iostream> // Для потокового введення-виведення

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

void Xhandler(int test)

{

try {

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

if(test == l) throw 'a'; // Генерує char-винятки

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

}

catch(...) { // Перехоплення всіх винятків

cout << "Перехоплення!\n";

}

}

int main()

{

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

Xhandler(0);

Xhandler(1);

Xhandler(2);

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

getch(); return 0;

}

Внаслідок виконання цієї програми на моніторі буде відображено такі результати:

Початок.

Перехоплення!

Перехоплення!

Перехоплення!

Кінець програми

Як бачите, всі три throw-винятки перехоплені за допомогою однієї catch-настанови.

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

Код програми 18.9. Демонстрація механізму використання настанови catch(...) для перехоплення винятків "усіх решти" типів

#include <iostream> // Для потокового введення-виведення

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

void Xhandler(int test)

{

try {

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

if(test == l) throw 'a'; // Генерує char-винятки

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

}

catch(int izm) { // Перехоплює int-винятки

cout << "Перехоплення " << izm << "\n";

}

catch(...) { // Перехоплює всю решту винятків

cout << "Перехоплення-перехоплення!\n";

}

}

int main()

{

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

Xhandler(0);

Xhandler(1);

Xhandler(2);

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

getch(); return 0;

}

Результати, що було згенеровано у процесі виконання цієї програми, є такими:

Початок.

Перехоплення 0

Перехоплення-перехоплення!

Перехоплення-перехоплення!

Кінець програми

Як підтверджує цей приклад, використання формату catch(...) як "останнього рубежу" catch-послідовності – це зручний спосіб перехопити всі винятки, які Вам не хочеться обробляти в безпосередньому вигляді. Окрім того, перехоплюючи абсолютно всі винятки, Ви запобігаєте можливості аварійного завершення роботи програми, яке може бути викликане якимсь непередбаченим (а значить, необробленим) винятком.