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 стороною.


 

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

15730. Маркировка автомобильных шин 140.17 KB
  Маркировка автомобильных шин Автомобильные шины маркируются алфавитноцифровым кодом который обозначается на борту шины. Этот код определяет размеры шины и некоторые из ее ключевых характеристик типа индикаторов нагрузки и скорости. Иногда внутренний борт шины со
15731. Проект организации ТО и ремонта МТП в ЦРМ хозяйства с годовым объемом работ 33000 часов 151.16 KB
  КУРСОВАЯ РАБОТА Тема: Проект организации ТО и ремонта МТП в ЦРМ хозяйства с годовым объемом работ 33000 часов РЕФЕРАТ Пояснительная записка курсового проекта содержит 39 листов машиннопечатного текста формата А4 13 таблиц и два приложения список использованно
15732. МОДЕЛИРОВАНИЕ СОСТАВА МАШИННО-ТРАКТОРНОГО ПАРКА 369.5 KB
  Реферат по моделированию: МОДЕЛИРОВАНИЕ СОСТАВА МАШИННОТРАКТОРНОГО ПАРКА ВВЕДЕНИЕ За последние годы произошло значительное сокращение количества сельскохозяйственной техники в стране. Тяжелое финансовое положение предприятий нарушенный паритет цен на маши...
15733. ОСНОВНЫЕ ДАННЫЕ ДВИГАТЕЛЯ М-14П 422 KB
  КОНСТРУКЦИЯ ДВИГАТЕЛЯ М14П ОСНОВНЫЕ ДАННЫЕ ДВИГАТЕЛЯ М14П ОБЩИЕ СВЕДЕНИЯ Авиационный двигатель М14П поршневой четырехтактный бензиновый с воздушным охлаждением девятицилиндровый однорядный со звездообразным расположением цилиндров и с карб...
15734. Технология восстановления типовых деталей 92 KB
  Реферат по дисциплине Надежность и ремонт машин на тему: Технология восстановления типовых деталей Содержание 1 Номенклатура классов и групп деталей машин. 2 Характерные дефекты и способы их устранения у типовых деталей 2.1 Корпусные детали 2.2 ...
15735. Способы устранения дефектов деталей автомобиля 89.5 KB
  Способы устранения дефектов деталей автомобиля Виды и характеристика дефектов Наиболее распространенными дефектами деталей автомобилей и агрегатов поступающих на КР являются: изменение размеров рабочих поверхностей; механические повреждения; нарушение...
15736. Организация сбора и хранения отработанного масла и маслосодержащих отходов 281.5 KB
  Организация сбора и хранения отработанного масла и маслосодержащих отходов Отработанные нефтепродукты являются опасными загрязнителями практически всех компонентов природной среды поверхностных и подземных вод почвеннорастительного покрова атмосферного воз
15737. Технологический процесс изготовления коленчатого вала 46.96 KB
  Технологический процесс изготовления коленчатого вала. Получение заготовки. Заготовки коленчатых валов получают горячей штамповкой и литьём. Кованые коленчатые валы изготовляются из углеродистых и легированных сталей а литые валы – из высокопрочных глобулярны...
15738. Крышка подшипника ва-ла привода к переднему мос- ту раздаточной коробки № 63-1802118-Б 1.32 MB
  Введение Ремонт процесс восстановления и поддержания работоспособности автомобиля путем устранения отказов и неисправностей возникающих в работе или выявленных при техническом обслуживании. Ремонтные работы выполняют по потребности т. е. после появления отказа ил...