Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

18.1.2. Використання функцій exit() і abort() для завершення роботи програми

Функції exit() і abort() входять до складу стандартної бібліотеки C++ і часто використовують під час програмування мовою C++. Обидві вони забезпечують завершення роботи програми, але відбувається це по-різному.

Виклик функції exit() негайно приводить до "правильного" припинення роботи програми1. Зазвичай цей спосіб завершення роботи використовують для зупинки програми під час виникнення непоправної помилки, яка робить подальше її виконання безглуздим або небезпечним. Для використання функції exit() потрібно залучити до програми заголовок <cstdlib>. Її прототип має такий вигляд:

void exit(int status);

Оскільки функція exit() викликає негайне завершення роботи програми, то вона не передає керування процесу, що її викликає, і не повертає ніякого значення. Проте процесу, що її викликає, як код завершення передається значення параметра status. За домовленістю нульове значення параметра status вказує на успішне завершення роботи програми. Будь-яке інше його значення свідчить про завершення роботи програми помилковим. Для індикації успішного завершення роботи можна також використовувати константу EXIT_SUCCESS, а для індикації помилки – константу EXIT_FAILURE. Ці константи визначаються у заголовку <cstdlib>.

Прототип функції abort() має такий вигляд:

void abort();

Аналогічно функції exit() функція abort() викликає негайне завершення роботи програми. Але, на відміну від функції exit(), вона не повертає операційній системі ніякої інформації про статус завершення роботи програми і не виконує стандартної ("правильної") послідовності дій під час зупинки програми. Для використання функції abort() потрібно залучити до програми заголовок <cstdlib>. Функцію abort() можна назвати аварійним "стоп-краном" для С++-програми. Її необхідно використовувати тільки після виникнення непоправної помилки.

Останнє повідомлення про аварійне завершення роботи програми (Abnormal program termination) може відрізнятися від наведеного в результатах виконання попереднього прикладу. Це залежить від використовуваного Вами компілятора.

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

Код програми 18.3. Демонстрація механізму генерування винятку функцією, що викликається з try-блоку

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

void Xtest(int test)

{

cout << "У функції Xtest() значення test дорівнює: "

<< test << "\n";

if(test) throw test;

}

int main()

{

cout << "Початок.\n";

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

cout << "B try-блоці\n";

Xtest(0);

Xtest(1);

Xtest(2);

}

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

cout << "Значення перехопленого винятку дорівнює: ";

cout << izm << "\n";

}

cout << "Кінець програми";

getch(); return 0;

}

Внаслідок виконання цієї програми на моніторі буде відображено такі результати:

Початок.

У try-блоці

У функції Xtest() значення test дорівнює: 0

У функції Xtest() значення test дорівнює: 1

Значення перехопленого винятку дорівнює: 1

Кінець програми

Блок try може бути локалізований у межах роботи самої функції. У цьому випадку під час кожного її виконання запускається і оброблення винятків, пов'язаних з роботою цією функцією. Розглянемо таку просту програму.

Код програми 18.4. Демонстрація локалізації блоку try у рамках роботи самої функції

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

// Функціонування блоків try/catch поновлюється

// під час кожного входження у функцію.

void Xhandler(int test)

{

try {

if(test) throw test;

}

catch(int izm) {

cout << "Перехоплення! Виняток №: " << izm << "\n";

}

}

int main()

{

cout << "Початок.\n";

Xhandler(1);

Xhandler(2);

Xhandler(0);

Xhandler(3);

cout << "Кінець програми";

getch(); return 0;

}

У процесі виконання цієї програми на моніторі будуть відображені такі результати:

Початок.

Перехоплення! Виняток №: 1

Перехоплення! Виняток №: 2

Перехоплення! Виняток №: 3

Кінець програми

Як бачите, програма згенерувала три різних винятки. Після кожного винятку функція Xhandler() передавала керування у функцію main(). Коли вона знову викликалася, поновлювалося і оброблення винятків.

У загальному випадку try-блок відновлює своє функціонування під час кожного входу в нього. Тому try-блок, який є частиною циклу, запускатиметься під час кожного повторення цього циклу.