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

Void Xhandler(int test) throw 0

{

І* Наведені нижче настанови більше не працюють.

Тепер вони можуть викликати тільки аварійне завершення роботи коду програми*/ if(test == 0) throw test; if(test == I) throw 'a'; if(test== 2) throw 123.23;

}

  1. Повторне генерування винятку

Для того, щоби повторно згенерувати винятки в його обробнику, необхідно використовувати throw-настанову без вказання типу винятку. У цьому випадку по­точний виняток передається в зовнішню try/catch-послідовність. Найчастіше при­чиною для такого виконання настанови throw слугує прагнення мати доступ до од­ного винятку декільком обробникам. Наприклад, перший обробник винятків пові­домлятиме про один аспект винятку, а другий - про щось інше. Винятки можна повторно згенерувати тільки в catch-блоці (або в будь-якій функції, яка викли­кається з цього блоку). При повторному генеруванні винятку сам виняток не пере­хоплюватиметься тією ж catch-настановою. Він пошириться на найближчу try/catch-послідовність.

Повторне генерування винятку типу char * продемонстровано у наведеному нижче коді програми.

Код програми 8.11. Демонстрація механізму повторного генерування винятку типу char *

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

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

void XhandlerO {

try {

throw "Привіт"; //Генерує винятки типу char*

}

catch(char *) {// Перехоплює винятки типу char *

cout«"Перехоплення винятку у функції Xhandler" « endl; throw; // Повторне генерування винятку типу char*,

// яке перехоплюватиметься поза функцією Xhandler.

}

}

int mainO

{

cout«"Початок"« endl; try {

XhandlerO;

}

catch(char *) {

cout«"Перехоплення винятку у функції mainO" « endl;

}

cout«"Кінець програми"; getchO; return 0;

}

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

Перехоплення винятку у функції Xhandler.

Перехоплення винятку у функції mainO- Кінець програми

  1. Оброблення винятків, згенерованих оператором new

Як зазначалося вище, оператор new генерує винятки, якщо не вдається задо­вольнити запит на виділення області пам'яті. Там опис оброблення винятків тако­го типу було відкладено на потім. Якраз тепер настав час розглянути цю проблему детальніше.

Спершу необхідно зазначити, що у цьому розділі описано поведінку операто­ра new відповідно до стандарту мови C++. Проте, дії, які здійснює система при не­успішному використанні оператора new, з моменту появи мови C++ змінювалися вже декілька разів. Спочатку оператор new повертав при невдачі значення NULL. Пізніше така поведінка була замінена генеруванням винятку, ім'я якого також мі­нялося кілька разів. Нарешті, було вирішено, що оператор new генеруватиме виня­ток за замовчуванням, але як альтернативний варіант він може повертати і нульо­вий покажчик. Отже, оператор new у різний час був реалізований різними спосо­бами. І хоча всі сучасні компілятори реалізують оператор new відповідно до стан­дарту мови C++, компілятори "поважнішого" віку можуть містити відхилення від нього. Якщо наведені тут приклади кодів програм не працюють коректно з Вашим компілятором, то зверніться до документації, що додається до компілятора, і поці­кавтеся, як саме він реалізує функціонування оператора new.

Згідно зі стандартом мови C++, у випадку неможливості задовольнити запит на виділення області пам'яті, потрібної операторові new, генерується виняток типу bad_alloc. Якщо Ваша програма не перехопить його, то вона буде завчасно завер­шена. Хоча така поведінка виправдана для коротких прикладів програм, в реаль­них додатках необхідно перехоплювати цей виняток і розумно обробляти його. Щоб отримати доступ до винятку типу bad_alloc, потрібно залучити до програми заголовок <new>.

Розглянемо приклад використання оператора new, поміщеного в try/catch-блок для вистежування невдалих результатів запиту на виділення області пам'яті.

Код програми 8.12. Демонстрація механізму оброблення винятків, згенерованих оператором new

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

#include <new> // Для перевизначення операторів new і delete

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