Програмування С, С++теорія та практика (частина 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) ;
Якщо функція збуджує виняткову ситуацію, виконання ігу-блоку негайно припиняється, і отримані об'єкти перехоплюються відповідними операторами саісН, що обробляють дану ситуацію. У нашому випадку два оператори саісН обробляють виняткові ситуації для рядкового значення та типу класу СІаззА. Якщо при активації функції виконається перша умова, функція збуджує виняткову ситуацію з рядковим повідомленням, якщо виконується друга умова, функція посилає об'єкт типу СІаззА, який створюється в даному випадку за допомогою звернення до конструктору класу по замовчуванню. У випадку, коли виняткових ситуацій не виникне, функція завершить свою роботу, повертаючи при цьому значення типу, з яким ця функція оголошена, в місце виклику цієї функції.
Виняткові ситуації відкидають необхідність резервування спеціальних значень у помилкових ситуаціях. Якщо у програмі виникли необроблені виняткові ситуації, то по замовчуванню викликається функція ипехресіеії(). Найчастіше ипехресіеії() викликає функцію іегтіпаіе(), яка, в свою чергу, викликає функцію аЬогі() для аварійного завершення програми. Є можливість замінити ипехресіеії() та іегтіпаіе() власними функціями-обробниками виняткових ситуацій.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
Схожі підручники
- ЗМІСТ НАВЧАЛЬНОЇ ДИСЦИПЛІНИ ЗА ЗМІСТОВИМИ МОДУЛЯМИ
- Світовий ринок послуг онлайн (частина 1)
- Державне управління у галузі охорони природи. Екологічне право
- ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 8) онлайн
- ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 11) онлайн
- ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 1) онлайн
