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

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

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

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

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

}

У цьому записі занесені в круглі дужки крапки забезпечують збіг з будь-яким ти­пом. Використання формату catch(...) продемонстровано в такому коді програми.

Код програми 8.8. Демонстрація механізму перехоплення винятків усіх типів #include <iostream> // Для потокового введення-виведення

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

void Xhandler(int test)

{

try {

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

}

catch(...) {// Перехоплення всіх винятків cout«"Перехоплення!" « endl;

}

}

int mainO

{

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

Xhandler(O);

Xhandler(1);

Xhandler(2);

cout«"Кінець програми"; getchO; return 0;

}

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

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

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

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

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

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

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

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

для перехоплення винятків усіх інших типів #include <iostream> // Для потокового введення-виведення

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

void Xhandler(int test)

{

try {

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

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

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

}

catch(int c) {// Перехоплює int-винятки cout«"Перехоплення" « c « endl;

}

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

cout«"Перехоплення-перехоплення!" « endl;

}

}

int mainO

{

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

Xhandler(O);

Xhandler(1);

Xhandler(2);

cout«"Кінець програми"; getchO; return 0;

}

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

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

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

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

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