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


 

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

71916. Жизненный цикл услуги и объекта ТКС 144.85 KB
  Принятое в международных стандартах ITU серии 9000 (стандарты ISO) фундаментальное положение о качестве предусматривает систему целенаправленных мероприятий действующих в течение всего жизненного цикла продукции. Этот цикл представляет собой совокупность взаимосвязанных процессов изменения ее состояния от момента создания до утилизации.
71917. Судебная система Российской Федерации, раскрытие понятия и ее основных признаков 100.5 KB
  К гражданским судам относятся верховные суды республик краевые областные городов федерального значения суды автономных округов и областей районные городские суды. Военные суды создаются по территориальному принципу по месту дислокации войск и флотов: окружные флотские и гарнизонные.
71918. Управление трафиком в сетях MPLS 55 KB
  Традиционно главными требованиями предъявляемыми к технологии магистральной сети были высокая пропускная способность малое значение задержки и хорошая масштабируемость. Для решения возникающих задач и разрабатывается архитектура MPLS которая обеспечивает построение магистральных сетей...
71919. Система лицензирования услуг связи 137.02 KB
  Согласно последним провайдерам необходимо обеспечить возможность начинать хозяйственную деятельность после сообщения о намерении работать в сфере телекоммуникаций а получать индивидуальные лицензии следует лишь при распределении ограниченного радиочастного или номерного ресурса.
71920. Освіта в Іспанії та Італії 123 KB
  Чималі мовні і культурні відмінності між регіонами країни, мовою якої став кастільський діалект (літературна іспанська). Кілька регіонів (Каталанія, Валенсія, баскська провінція тощо) мають свої мови за другу офіційну мову. Майже 85% населення — католики, представників інших релігій мало.
71921. СПОСОБЫ ЗАЩИТЫ ОТКОСОВ ЗЕМЛЯНОГО ПОЛОТНА ОТ ВОЗДЕЙСТВИЯ ДОЖДЕВЫХ И ПАВОДКОВЫХ ВОД 2.55 MB
  Для защиты земляного полотна от воздействия атмосферных в том числе паводковых вод от его размыва ими и инфильтрации воды в грунт в первую очередь осуществляют планировку всех поверхностей земляного полотна полосы отвода берм, резервов кавальеров водосборно-водоотводных устройств и пр.
71922. Методы очистки вод от нитратов и нитритов 115 KB
  Огромное значение вода имеет в промышленном и сельскохозяйственном производстве. Общеизвестна необходимость ее для бытовых потребностей человека, всех растений и животных. Для многих живых существ она служит средой обитания.
71923. Екологічный туризм 26.96 KB
  У більшості країн світу туризм відіграє значну роль в економіці, стимулювання соціального розвитку регіонів, надходження коштів до державної скарбниці. На частку туризму припадає близько 10 відсотків світового валового національного продукту, світових інвестицій...
71924. Зоны генерации отражательного клистрона 314 KB
  Зависимость от частоты называется фазочастотной характеристикой резонатора рис. Вблизи собственной частоты резонатора зависимость от очень сильная и тем сильнее чем выше добротность резонатора.