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

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

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

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

// Тут можливе перехоплення винятків різних типів, void Xhandler(int test)

{

try {

if(test) throw test;

else throw "Значення дорівнює нулю.";

}

catch nt c) {

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

}

catch(char *str) {

cout«"Перехоплення рядка:str« endl;

}

}

int mainO

{

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

Xhandler(1);

Xhandler(2);

Xhandler(O);

Xhandler(3);

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

getchO; return 0;

}

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

Перехоплення! Виняток №: 1 Перехоплення! Виняток №: 2 Перехоплення рядка: Значення дорівнює нулю.

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

Як бачите, кожна catch-настанова відповідає тільки за винятки "свого" типу.

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

Перехоплення винятків базового класу. Важливо розуміти, як виконують­ся catch-настанови, пов'язані з похідними класами. Йдеться про те, що catch-вираз для базового класу відреагує збігом на винятки будь-якого похідного типу (тобто типу, виведеного з цього базового класу). Отже, якщо потрібно перехоплювати винятки як базового, так і похідного типів, то у catch-послідовності catch-HacTaHO- ву для похідного типу необхідно помістити перед catch-настановою для базового типу. Інакше catch-вираз для базового класу перехоплюватиме крім "своїх" і ви­нятки всіх похідних класів. Розглянемо, наприклад, такий код програми.

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

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

class bClass { // Оголошення класового типу };

class dClass: public bClass { // Оголошення класового типу };

int mainO

{

dClass derived; try {throw derived;}

catch(bClass ObjB) {cout << "Перехоплення винятку базового класу" << endl;} catch(dClass ObjD) {cout << "Це перехоплення не відбудеться" << endl;}

getchO; return 0;

}

Оскільки тут об'єкт derived - це об'єкт класу dClass, який виведено з базового класу bClass, то виняток типу derived завжди перехоплюватиметься першим catch- виразом; друга ж catch-настанова при цьому ніколи не виконається. Одні компіля­тори відреагують на такий стан речей застережним повідомленням, інші можуть видати повідомлення про помилку. У будь-якому випадку, щоб виправити ситу­ацію, достатньо поміняти порядок слідування цих catch-настанов на протилежний.