Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекцій.doc
Скачиваний:
15
Добавлен:
03.11.2018
Размер:
1.12 Mб
Скачать

13 Управління виключеннями

Під управлінням виключеннями(exeption handling) розуміють стандартний інтерфейс для виявлення та обробки незвичайних, непередбачених та виключних станів чи подій. Воно представляє формальний спосіб відхилити потік управління функції на неспецифіковану секцію кода, готову прийняти контроль над даною виключною ситуацією. Borland C++ підтримує два різновиди управління виключеннями:

  • управління виключеннями мови С++

  • структуроване управління виключеннями мови С

Виключення мають ряд переваг над традиційними методами повідомлень про помилкові стани:

  • єдинообразність стилю, яка покращує читабельність програми

  • відсутність глобальних змінних та визначених користувачем процедур, що використовуються в таких цілях

  • розширення можливостей відладки. Механізм виключень є інтегрованою частиною мови та використовує підтримку бібліотек;відладчик забезпечує спеціалізовану підтримку, дозволяючи відслідковувати виключні ситуації.

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

Розглянемо синтаксис та використання обох механізмів.

13.1 Виключення та стек

Коли функція “викидає” (термін С++) чи “заявляє” (структурне управління С) виключення, управління передаєтьсмя для деякої секції кода, що належить функції, яка ще знаходиться у стеці викликів. Іншими словами, управління може бути переданим лише функції, яка була викликана раніше та ще не завершилась.

Стек являє собою область пам’яті, в якій зберігаються локальні (тимчасові) змінні та адреси повернення з функції. На комп’ютерах з процесорами INTEL регістр SP(вказівник стека) вказує на останнє значення(слово), яке поміщене в стек. Наприклад, для приведеної нижче програми стек в точці (1) всередині main() може представлений наступним чином:

верхні адреси пам’яті

змінна main() ‘i’

нижні адреси пам’яті

#include<fstream.h>

void func2()

{int l=0x1000L;

//(3) Коли упрвління досягне цієї точки, вказівник стеку вказує на змінну ‘l’;

// якщо рухатись вверх по стеку, то можна знайти:

// обрамлення стека func2()

// адресу повернення в func1()

// адресу повернення в main()

// змінну main() ‘i’

}

void func1()

{ifstream ifs(“STACK.CPP”);

//(2) рухаючись вверх по стеку, коли управління досягло цієї точки

//ми знайдемо:

//локальну змінну ‘ifs’

//обрамлення стека func1()

//адресу повернення в main()

// змінну main() ‘i’

func2();

}

int main(void)

{int i=0x1;

//(1) коли вказівник інструкцій досягне цього місця, вказівник стеку

//вказує на змінну ‘i’, останнє значення , поміщене в стек ...

func1();

return i;

}

В точці (3) всередині функції func2() стек виглядає так:

верхні адреси пам’яті

змінна main() ‘i’

адреса повернення main()

обрамлення стека func1()

змiнна func1() ‘ifs’

адреса повернення func1()

обрамлення стека func2()

змінна func2() ‘l’

нижні адреси пам’яті

Термін “стек викликів” означає послідовність викликаних функцій, які ще не завершилися, в результаті якої управління досягає певної точки програми. Стек викликів всередині func2():

func2()

func1()

main()

13.2 Робота з управлінням виключеннями мови С++