Void main(). cout << "In main" << endl;

{

cout << "In main" << endl;

try

{

MyFunc();

}

catch( CTest E )

{

cout << E.Show() << endl;

}

 

}

 

Результати виконання програми:

 

In main

Конструктор

Деструктор

Виключення у класі CTest class

 

У даному прикладі у функції MyFunc() створюється об'єкт класу CDtorDemo (при цьому в конструкторі виводиться текст "Конструктор"), потім генерується виключення класу СTest. Слід зазначити, що обробка цього виключення виконується після того, як об'єкт класу CDtorDemo звільняється, тобто спочатку виводиться в деструкторі текст "Деструктор". Тільки після цього виводиться текст обробки виключення "Виключення у класі CTest Class".

Як уже згадувалося, виключення може бути як стандартного, так і визначеного користувачем типу. При цьому немає необхідності визначати цей тип глобально – достатньо, щоб він був відомий в точці породження виключення і в точці його обробки. Клас для представлення виключення можна описати усередині класу, при роботі з яким воно може виникати. Конструктор копіювання цього класу має бути оголошений як public, оскільки інакше буде неможливо створити копію об'єкту при генерації виключення (конструктор копіювання, що створюється за умовчанням, має специфікатор public).

6.4 Список виключень функції

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

Алгоритм обробки виключення представлений на рис. 6.1.

Типи виключень перераховуються в дужках через кому після ключового слова throw, розташованого за списком параметрів функції, наприклад:

 

void f1() throw (int, const char*){ /*Тіло функції*/ }

void f2() throw (Oops*){ /*Тіло функції*/ }

 

Рис. 6.1 Алгоритм обробки виключення

 

Функція f1 повинна генерувати виключення тільки типів int і const char*.

Функція f2 повинна генерувати тільки виключення типу вказівки на клас Oops або похідних від нього класів.

Якщо ключове слово throw не вказане, функція може генерувати будь-яке виключення. Порожній список означає, що функція не повинна породжувати виключень:

 

void f() throw ()

{

// Тіло функції, яка не породжує виключень

}

 

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

Вказівка списку виключень ні до чого не зобов'язує – функція може прямо або побічно породити виключення, яке вона обіцяла не використовувати. Ця ситуація виявляється під час виконання програми і приводить до виклику стандартної функції unexpected, яка за умовчанням просто викликає функцію terminate. За допомогою функції set_unexpected можна встановити власну функцію, яка викликатиметься замість terminate і визначатиме дію програми при виникненні непередбаченої виключної ситуації.

Функція terminate за умовчанням викликає функцію abort, яка завершує виконання програми. За допомогою функції set_terminate можна встановити власну функцію, яка викликатиметься замість abort і визначатиме спосіб завершення програми. Функції set_unexpected і set_terminate описані в заголовному файлі <exception>.

 








Дата добавления: 2014-12-26; просмотров: 761;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.009 сек.