68959

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

Лекция

Информатика, кибернетика и программирование

Механізм обробки виняткових ситуацій в мові C++ заснований на трьох ключових словах: try, catch і throw. Фрагменти програми, що підлягають контролю, містять блок try. Якщо в ході виконання програми в блоці try виникає виняткова ситуація (тобто помилка), вона генерується...

Украинкский

2014-09-28

57 KB

4 чел.

Лекція № 21

Тема: Обробка виняткових ситуацій

Обробка виняткових ситуацій (exception handling) дозволяє правильно реагувати на помилки, що виникають в ході виконання програми. Використовуючи механізм виняткових ситуацій, програма може автоматично викликати процедуру обробки помилок. Це позбавляє програміста від утомливого кодування.

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

Механізм обробки виняткових ситуацій в мові C++ заснований на трьох ключових словах: try, catch і throw. Фрагменти програми, що підлягають контролю, містять блок try. Якщо в ході виконання програми в блоці try виникає виняткова ситуація (тобто помилка), вона генерується за допомогою ключового слова throw. Потім виняткова ситуація перехоплюється блоком catch і обробляється. Уточнимо цей опис.

Код, що підлягає контролю, повинен виконуватися усередині блоку try. (Функції, що викликаються усередині блоку try, також можуть генерувати виняткові ситуації.) Виняткові ситуації перехоплюються оператором catch, який слідує безпосередньо за блоком try, в якому вони виникли. Загальний вид операторів try і catch показаний нижче.

try {

// Тіло блоку try 

}

catch (тип1 аргумент)

{

// Тіло блоку catch 

}

catch (тип2 аргумент)

{

  // Тіло блоку catch 

} catch (тип3 аргумент)

{

// Тіло блоку catch 

}

 catch(munN аргумент)

{

// Тіло блоку catch 

}

Розмір блоку try може варіюватися. Він може містити як декілька операторів, так і цілу програму (в цьому випадку функція main() цілком поміщається в блок try).

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

Оператора throw має наступний вигляд.

throw виняткова_ситуація;

 

Оператор throw генерує вказану виняткову ситуацію. Якщо в програмі передбачено її перехоплення, оператор throw повинен виконуватися або усередині блоку try, або усередині функції, явно або що неявно викликається усередині блоку try.

Якщо генерується виняткова ситуація, для якої не передбачена обробка, програма може припинити своє виконання. В цьому випадку викликається стандартна функція terminate (), яка за умовчанням викликає функцію abort (). Проте, як буде показано нижче, програміст може передбачити власну обробку помилки.

Розглянемо приклад, що демонструє обробку виняткової ситуації.

// Простій приклад обробки виняткової ситуації.

#include <iostream>

using namespace std;

int main() {

cout « "Початок\n";

try { // Початок блоку try

cout « "Усередині блоку try\n";

throw 100; // Генеруємо помилку.

cout << "Цей оператор не виконується.";

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

cout « "перехоплення виняткової ситуації - значення рівне: ";

cout « i « "\n";

}

cout « "Кінець";

return 0;

}

Ця програма виводить на екран наступні рядки.

Початок

Усередині блоку try

Перехоплення виняткової ситуації - значення рівне: 100

Кінець

Уважно проаналізуйте цю програму. Як бачите, блок try містить три оператори. З ним пов'язаний оператор catch (int i), що виконує обробку цілочисельної виняткової ситуації. Усередині блоку try виконуються тільки два з трьох операторів: перший оператор cout і оператор throw. При генерації виняткової ситуації управління передається операторові catch, а виконання блоку try припиняється. Інакше кажучи, блок catch не викликається. Просто програма переходить до його виконання. (Для цього стек програми автоматично оновлюється.) Таким чином, оператор cout, наступний за оператором throw, ніколи не виконується.

Зазвичай оператор catch намагається виправити помилку, роблячи відповідні дії. Якщо це можливо, виконання програми поновлюється з оператора, наступного за блоком catch. Проте часто помилку виправити неможливо, і блок catch припиняє виконання програми, викликаючи функцію exit () або abort ().

Як указувалося раніше, тип виняткової ситуації повинен співпадати з типом, вказаним в операторові catch. Наприклад, якщо в попередній програмі змінити тип аргументу оператора catch на double, перехоплення виняткової ситуації не відбудеться, і програма завершиться аварійно. Проілюструємо це наступним прикладом.

// Ця програма не працює.

#include <iostream>

using namespace std;

int main() {Початок\ п";

try { // Початок блоку try.

cout « "Усередині блоку try\n";

throw 100; // Генеруємо помилку.

cout << "Цей оператор не виконується";

} catch (double i) { // He перехоплює цілочисельні

// виняткові ситуації.

cout « "Перехоплення виняткової ситуації - значення рівне: ";

cout « i « "\n";

}

cout « "Кінець";

return 0;

}

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

Початок

Усередині блоку try

Abnormal program termination

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

/* Генерування виняткової ситуації усередині функції, що знаходиться поза блоком try.

*/

#include <iostream>

using namespace std;

void Xtest(int test)

{

cout « "Усередині функції Xtest, test =: " « test « "\n";

if(test) throw test;

}

int main() {

cout « "Початок\ п";

try { // Початок блоку try.

cout << "Усередині блоку try\n";

Xtest(0);

Xtest(1);

Xtest(2);

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

cout << "Перехоплення виняткової ситуації - значення рівне: ";

cout « i « "\n";

}

 

cout « "Кінець";

return 0;

}

Ця програма виводить на екран наступні рядки.

Початок

Усередині блоку try

Усередині функції Xtest, test = 0

Усередині функції Xtest, test = 1

Перехоплення виняткової ситуації - значення рівне: 1

Кінець

Блок try може знаходитися усередині функції. В цьому випадку при кожному вході у функцію обробка виняткової ситуації виконується наново. Як приклад проаналізуємо наступну програму.

#include <iostream>

using namespace std;

// Блоки try/catch знаходяться усередині функції.

void Xhandler(int test)

{

try {

if(test) throw test;

} catch(int i){

cout « "Перехоплення виняткової ситуації #: " << i << ' \n';

}

}

int main() {

cout « "Начало\ п";

Xhandler(l); Xhandler(2);

Xhandler(O); Xhandler(3);

cout « "Кінець";

return 0;

}

Ця програма виводить на екран наступні повідомлення.

Початок

Перехоплення виняткової ситуації #: 1

Перехоплення виняткової ситуації #: 2

Перехоплення виняткової ситуації #: 3

Кінець

Як видимий, в ході виконання програми були перехоплені три виняткові ситуації. Після кожної обробки функція повертає управління зухвалому модулю. При повторному виклику функції обробка виняткової ситуації виконується знов.

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

#include <iostream>

using namespace std;

int main()

{

cout « "Початок\ п";

try { // Початок блоку try.

cout << "Усередині блоку try\n";

cout « "Все ще усередині блоку try\n";

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

cout « "Перехоплення виняткової ситуації - значення рівне: ";

cout « i « "\n";

}

cout « "Кінець";

return 0;

}

Ця програма виводить на екран наступні повідомлення.

Початок

Усередині блоку try

Все ще усередині блоку try

Кінець

Як видимий, потік управління обійшов оператор catch стороною.


 

А также другие работы, которые могут Вас заинтересовать

60702. Світ в якому ми живем. КВК 35 KB
  Стоїть дороговказ на якому в усі напрямки написано Школа Звучить музика Чему учат в школе. 1809 Ведучий 1: Досліджуючи світ в якому живемо ми прийшли висновку якщо тобі від 6 до 17 років...
60705. Почитай отца твоего и мать твою, чтобы тебе было хорошо, и чтобы продлились дни твои на земле 37.5 KB
  К кому мы должны проявлять в семье уважение Но ведь написано только отца и мать Наверно других не обязательно уважать Правильно в семье все должны проявлять уважение друг к другу.
60706. Рослинна клітина 55.5 KB
  Засоби навчання: таблиця Будова рослинної клітини мікроскоп постійний мікропрепарат шкірочки цибулі вода калій йодид для приготування тимчасового препарату шкірочки цибулі.