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

Xtest(1);

Xtest(2);

}

catch(int c) {// Перехоплення помилки

cout«"Значення перехопленого винятку дорівнює:";

cout« с « endl;

}

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

}

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

У try-блоці

У функції XtestO значення test дорівнює: 0 У функції XtestO значення test дорівнює: 1 Значення перехопленого винятку дорівнює: 1 Кінець програми

Блок try можна локалізувати у межах роботи самої функції. У цьому випадку під час кожного її виконання запускається і оброблення винятків, пов'язаних з ро­ботою цією функцією. Розглянемо таку навчальну програму.

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

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

// Функціонування блоків try/catch поновлюється під час кожного входження у функцію, void Xhandler(int test)

{

try {

if(test) throw test;

}

catch (int c) {

cout«"Перехоплення! Виняток №:" « c « endl;

}

}

int mainO

{

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

Xhandler(1);

Xhandler(2);

Xhandler(O);

Xhandler(3);

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

}

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

Перехоплення! Виняток №:1 Перехоплення! Виняток №: 2 Перехоплення! Виняток №: З Кінець програми

Як бачите, програма згенерувала три різних винятки. Після кожного винятку функція Xhandler() передавала керування у функцію main(). Коли вона знову викли­калася, поновлювалося і оброблення винятків.

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

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

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

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

#include <cstring> // Для роботи з рядковими типами даних

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

class myException { public:

char str[80];

myException 0 {*str = 0;}

myException(char *s) {strcpy(str, s);}

};

int mainO

{

int a, b; try {

cout«"Введіть чисельник і знаменник: сіп » а » Ь;

if(!b) throw туЕхсерІіоп("Ділити на нуль не можна!"); else cout«"Частка дорівнює"« a/b « endl;

}

catch(myException е) {// Перехоплення помилки cout« e.str« endl;

}

getchO; return 0;

}

Один з можливих результатів виконання цієї програми.

Введіть чисельник і знаменник: 10 0 Ділити на нуль не можна!

Після запуску програми користувачу пропонується ввести чисельник і зна­менник. Якщо знаменник дорівнює нулю, то створюється об'єкт класу myException, який містить інформацію про спробу ділення на нуль. Також клас myException ін- капсулює інформацію про помилку, яка потім використовується обробником ви­нятків для повідомлення користувача про те, що трапилося.

Безумовно, реальні винятки класового типу набагато складніші за клас myEx­ception. Як правило, створення винятків класового типу має сенс у тому випадку, якщо вони інкапсулюють інформацію, яка дає змогу обробнику винятків ефектив­но справитися з помилкою і за змогою відновлює працездатність програми.