Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /home/studb20/public_html/index.php on line 4
 2.14 Обробка виняткових ситуацій - Програмування С, С++теорія та практика (частина 2) - Studbook
Главная->Інформатика та програмування->Содержание->2.14 Обробка виняткових ситуацій

Програмування С, С++теорія та практика (частина 2)

2.14 Обробка виняткових ситуацій

Виняткова ситуація у програмі - це виникнення деякої непередбачуваної або аварійної події, що потребує спеціальної обробки. Наприклад, це ділення на нуль або звертання за неіснуючою адресою пам'яті. Такі події, як правило, призводять до завершення програми з системним повідомленням про помилку. Сі++ дає можливість коректно обробляти такі ситуації, не припиняючи програми, продовжувати її виконання.

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

Перейдемо до синтаксису виняткових ситуацій, для чого детально розглянемо оператори ігу, іНгом та саісН. Усі три перераховані оператори носять назву операторів-обробників виняткових ситуацій в Сі++. Програма спроможна генерувати виняткові ситуації, якщо вона містить принаймні один ігу-блок, що генерує (збуджує) таку ситуацію. Такий блок завжди виокремлюється фігурними дужками:

ігу{

........ // тіло (гу-блока

}

Для генерації (збудження) виняткової ситуації виконується оператор іНгом, який може використовуватися з параметром, або без нього:

іИгоЦвираз];

Оператор ґкгом> посилає об'єкт, що описує суть помилкової ситуації. Такий об'єкт може бути звичайним виразом певного типу - літеральним значенням, рядком, об'єктом класу тощо. Розглянемо деяку гіпотетичну функцію, в якій забезпечується підтримка збудження виняткових ситуацій двох видів: іп£ £ипс()

{

і£ (сопйі^іоп1) ■ЬЬгом ("'ЬгоиЬ1е 1"); і£ (сопйі^іоп2) ■ЬЬгом С1аззА() ; ге'Ьигп 0;

}

Обробка збуджених ситуацій починається з оператору саґск, який перехоплює виняткову умову, згенеровану якимось процесом: са^сЬ (тип)

{

/* тіло обробника*/

}

Так, для обробки першої з двох помилкових ситуацій цей оператор може бути записаний так: са^сЬ (сЬаг *теззаде)

{

сои^<<"Еггог -- "<<теззаде<<епй1;

ехі£ (-1) ;

}

Тепер є все необхідне, щоб організувати обробку виняткових ситуацій вищенаведеної функції іпґ /ипс(), але перш за все її виклик слід обов’язково розмістити в середині блоку ґгу :

■Ьгу

{

іп£ а=£ипс();

сои£<< "а=="<<а<<епй1;

}

Таке розміщення виклику функції говорить про те, що вона не є просто звичайною функцією. Визначивши помилковий стан, функція спроможна збуджувати виняткову ситуацію, що викликає наступні наслідки:

•     функція визначає, що дійсно виникла умова виняткової ситуації;

•     функція спроможна збуджувати одну або декілька виняткових ситуацій різних типів, використовуючи оператор ґкгом>, що відповідають різним умовам виняткових ситуацій;

•            як тільки оператор ґкгом> збуджує виняткову ситуацію, функція негайно завершує своє виконання;

•     надалі функція "робить запит" на розв'язування проблеми обробником виняткової ситуації саґск, що викликається автоматично на посилання об'єкта виняткової ситуації.

Для нашого прикладу за блоком ґгу повинні слідувати декілька операторів-обробників саґск. Тоді розглядуваний гіпотетичний приклад набуде закінченого вигляду: с1азз С1аззА{

// клас, що повідомляє про своє створення та знищення риЬ1іс:

С1аззА(){сои^<<"Ие11о!"<<епй1;}

~С1аззА(){сои^<<"Буе!"<<епй1;}

};

іп£ £ипс()

{

іп£ а;

а=....???; // код помилкової ситуації і£ (а==0) ■ЬЬгом ("ТгоиЬ1е 1") ; і£ (а==1) £Ьгом С1аззА(); ге'Ьигп 0;

}

іп£ таіп(VОій)

{

■Ьгу

{

сои^<<" Входимо у £гу-блок"<<епй1; іп£ а=£ипс();

сои^<<" Виходимо з £гу-блоку"<<епй1; сои£<< "а=="<<а<< епй1;

}

са£сЬ (сЬаг *теззаде)

{

сои^<<"Еггог --- "<<теззаде<<епй1;

ехі£(-1);

}

са£сЬ (С1аззА)

{

сои^<<" С1аззА! "<<епй1; ехі£(-2) ;

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

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

 

54