68959

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

Лекция

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

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

Украинкский

2014-09-28

57 KB

3 чел.

Лекція № 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 стороною.


 

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

52126. Методи розвязування показникових рівнянь 1.22 MB
  Мета: Систематизувати й узагальнити знання уміння та навички учнів із теми формувати вміння учнів розв’язувати показникові рівняння різними способами: зведення до однієї основи до спільного...
52127. Розвязування вправ з використанням формул скороченого множення 150 KB
  Розв’язування вправ з використанням формул скороченого множення. – навчальна формувати удосконалити та поглибити знання та вміння учнів використовувати формули скороченого множення: при розв’язуванні вправ формувати навички їх творчого застосування при розв’язуванні завдань високого рівня складності; розвивальна розвивати логічне мислення математичну мову вміння чітко висловлювати думки узагальнювати активність; виховна інтерес до математики. Розв’язування вправ на застосування формул скороченого множення: для виконання...
52128. Действия с многочленами 51 KB
  Развивающие: развитие логического мышления, активности, познавательного интереса учащихся, умения работать самостоятельно, четко высказывать свои мысли. Развитие коммукативной компетентности, компетентности продуктивной творческой деятельности.
52129. Винесення спільного множника за дужки 87 KB
  Мета: навчити учнів застосовувати даний спосіб під час розвязування задач, розвивати внутрішню мотивацію учнів до теми, що вивчається; навчити учнів прогнозувати очікувані результати уроку; відтворити необхідні знання та вміння для досягнення результатів уроку.
52131. Степінь з цілим показником 544 KB
  8 клас алгебра Тема уроку: Степінь з цілим показником. Мета уроку: Ввести поняття степеня з цілим показником. Тип уроку: урок вивчення нового матеріалу Обладнання: дидактичний матеріал таблиця підручники збірник завдань А. ХІД УРОКУ: 1.
52132. Збірник завдань для тематичної атестації з алгебри для класів з поглибленим вивченням математики 11.53 MB
  Збірник є дидактичним матеріалом з алгебри для 8 класу з поглибленим вивченням математики. Він містить 10 контрольних робіт в двох варіантах, за структурою наближених до атестаційної роботи в 9 класі.
52133. Функціональний підхід до розв’язування рівнянь 107.5 KB
  Дидактична мета уроку: а Повторити та узагальнити основні методи розв’язування рівнянь тригонометричних ірраціональних показникових логарифмічних. б Сформувати у учнів поняття про функціональний підхід до розв’язування рівнянь як один із нестандартних евристичних прийомів. б Розвивати творчі логічні та інтелектуальні здібності учнів.
52134. Дидактичний матеріал для рівневого навчання 520.5 KB
  Опрацювавши матеріали розділу учні зможуть упізнавати функції встановлювати умови при яких вони мають певні властивості за однією властивістю “бачити †інші зводити розв’язування задач до розв’язування відомих.