Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР3_ООП.doc
Скачиваний:
1
Добавлен:
14.11.2019
Размер:
173 Кб
Скачать
☆

Генерування винятків

Для позначення в програмі місця і типу винятку, який викидається, служить ключове слово throw. Синтаксис його використання такий:

throw <вираз>;

де <вираз> – це вираз, обчислене значення якого ініціалізує тимчасовий об’єкт типу, що визначається типом цього виразу (тобто throw (T arg)), Внаслідок цього корисно визначити конструктор копіювання для об’єкту типу винятку, якщо він містить підоб’єкти. Розташування інструкції throw визначає точку викиду винятку.

Операнд в інструкції throw не є обов’язковим, Інструкція throw без операнда використовується для повторного викидання винятку того ж типу, який обробляється в даний момент. Отже, вона може використовуватися лише в catch-блоках.

Розглянемо приклад, який демонструє викидання винятків:

# іnclude <stdio.h>

bool test;

class SomeException {};

void Func (bool bvar)

{

if (bvar) throw SomeException();

}

int main ()

{

try

{

test = true;

Func (true);

}

catch (SomeException& e)

{

test = false;

}

return test? (puts ("test = true.\n"),1):

(puts (“test = false.\n"), 0);

}

При виконанні програма виводить на екран:

test = false

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

# іnclude <iostream>

using std :: cout;

class SomeException {};

int main ()

{

try

{

try

{

throw SomeException();

}

catch (...) / / Обробляти всі винятки

{

/ / Часткова обробка винятків

/ / Повторне викидання такого самого винятку

throw;

}

}

catch (SomeException& e)

{

cout << "SomeException оброблено.\n";

}

return 0;

}

Ключове слово throw може використовуватися не тільки як інструкція компілятору викинути виняток, а й для специфікації винятків, які може викидати деяка функція. Специфікація винятків має наступний формат:

throw (<типl>, <тип2>, ...)

Вона вказується після списку параметрів функції. Якщо для функції задані типи винятків, які вона може викидати, це ще не означає, що вона не може викидати винятки інших типів. Якщо така функція все ж викидає винятки не передбаченого в специфікації типу, то це розглядається як несподіваний виняток (unexpected exception) – особливий вид винятків, який також може бути оброблений. Щоб заборонити функції викидати будь-які винятки, використовується специфікація винятків без типу. З іншого боку, функції без специфікації можуть викидати винятки будь-якого типу.

Зауваження. Компілятор Visual С++ не підтримує специфікації винятків для функцій, як це запропоновано стандартом мови.

Розглянемо приклад:

#іnclude <stdio.h>

boot test;

class ExClass {};

/ / Ця функція може викидати винятки

/ / тільки типу ExClass

void ExThrowFunc (bool bvar) throw (ExClass)

{

if (bvar) throw ExClass ();

}

/ / Ця функція не може викидати винятки

void TestFunc() throw()

{

try

{

ExThrowFunc (true);

}

catch (ExClass& e)

{

test = true;

}

}

int main ()

{

test = false;

TestFunc();

return test?

(puts(“Функція TestFunc () опрацювала виняток. "),1):

(puts ("Жодних винятків не сталося. "),0);

}

При виконанні програма виводить на екран:

Функція TestFunc() опрацювала виняток.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]