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

Перехоплювання винятків

Якщо при роботі програми в певній точці викидається виняток, потік виконання програми переривається і виходить наступне:

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

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

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

  • управління програмою передається знайденому обробнику;

  • якщо обробник не знайдений, ви можете викликати set__terminate (), надавши обробник завершення; в іншому випадку програма викликає функцію завершення.

Якщо виняток не викинуто, програма виконується звичайним чином.

При пошуку відповідного типу винятку компілятор користується такими

правилами. Оброблювач вважається знайденим, якщо:

  • тип викинутої змінної співпадає з типом, очікуваним обробником; іншими словами, якщо тип викинутої змінної Т, відповідними йому визнаються обробники, що перехоплюють виключення типу Т, const Т, Т& і constТ&;

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

  • викинута змінна є об’єктом деякого класу, а тип перехоплених винятків є базовим класом, успадкованим цим об’єктом як public.

Ще раз підкреслимо, що компілятор шукає найближчого обробника, який приймає параметр, сумісний з типом викинутої змінної. Цей момент не слід забувати і уважно стежити за порядком, в якому розташовуються в програмі обробники винятків для даного try-блоку. Оброблювач, що очікує виняток базового класу, приховує обробник похідного класу. Точно так само обробник для вказівника типу void* приховує обробник для вказівника будь-якого типу. Розглянемо приклад:

#іnclude <iostream.h>

class Base

{

};

class Derived: public Base

{

};

void FuncExDerived ()

{

Derived derOb;

throw derOb;

}

void FuncExErr()

{

throw "Помилка у функції FuncExErr ()";

}

int main()

{

try

{

FuncExDerived();

}

catch (Derived&)

{

cout << "Виняток перехоплено" << "в Derived&" << endl;

}

/ / Цей обробник може приховувати попередній,

/ / якщо буде розміщений перед ним.

catch(Base&)

{

cout <<" Виняток перехоплено "<" в Base & "<< endl;

}

try

{

FuncExErr ();

}

catch (const char*)

{

cout << "Виняток перехоплено" << "в const char*" << endl;

}

/ / Цей обробник може приховувати

/ / попередній, якщо буде розміщений перед ним.

catch (void*)

{

cout << "Виняток перехоплено " << "в void*" << endl;

}

return 0;

}

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

Виняток перехоплено в Derived&

Виняток перехоплено в const char*

Якщо переставити місцями обробники переривання, результат буде зовсім іншим.

Завдання до лабораторної роботи № 3

Загальні вказівки для всіх варіантів

У всіх варіантах потрібно створити шаблон деякого цільового класу А, можливо, реалізований із застосуванням деякого серверного класу В. Це означає, що об’єкт класу В використовується як елемент класу А. В якості серверного класу може бути вказаний або клас, створений програмістом або клас зі стандартної бібліотеки – наприклад, std:. vector.

Варіанти цільових або серверних класів, які створюються програмістом, наведені в табл. 1.

Таблиця 1

Варіанти цільових або серверних класів

Ім'я класу

Призначення

Vect

одновимірний динамічний масив

List

двонаправлений список

Stack

стек

В1пагуТгее

бінарне дерево

Queue

одностороння черга

Deque

двостороння черга (допускає вставку і видалення з обох

кінців черги)

Set

множина (елементи, які повторюються, в множину не заносяться;

елементи в множині зберігаються відсортованими)

SparseArray

розріджений масив

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

У всіх варіантах необхідно передбачити генерацію і обробку винятків для можливих помилкових ситуацій.

У всіх варіантах показати в клієнті main() використання створеного класу, який містить ситуації, що призводять до генерації винятків. Показати генерацію шаблону для типів int, double, std :: string.

Варіанти завдань наведені в табл. 2.

Таблиця 2

Варіанти завдань

Варіант

Цільовий шаблонний клас

Реалізація з використанням

1

Vect

std: :list

2

List

–

3

Stack

Динамічний массив

4

Stack

Vect

5

Stack

List

6

Stack

Std::vector

7

Stack

std::list

8

BinaryTree

–

9

Queue

Vect

10

Queue

List

11

Queue

Std::list

12

Deque

Vect

13

Deque

List

14

Deque

Std::list

15

Set

Динамічний масив

16

Set

Vect

17

Set

List

18

Set

Std::vector

19

Set

Std::list

20

SparseArray

list

Література

  1. Т.А.Павловская. С/С++. Программирование на языке высокого уровня. – СПб., 2008.

  2. В.В.Лаптев. С++. Объектно-ориентированное программирование. ­ – СПб., 2008.

  3. А. Пол. Объектно-ориентированное программирование на С++. - М., 2001.

  4. У.Савитч. Язык С++. Курс объектно-ориентированного программирования. Пер. С англ. – М., 2001.

  5. Б. Страуструп. Язык программирования С++. - СПб., 1999.

  6. С.В.Глушаков, А.В.Коваль, С.В.Смирнов. Язык программирования С++. - Харьков, 2002.

  7. Г. Шилдт. Теория и практика С++. – М., 2001.

  8. С. Прата. Язык программирования С++. – М.-СПб.- К., 2003.

  9. У. Топп. Структуры данных в С++. – М., 2000.

  10. Г.Буч. Объектно-ориентированный анализ и проектирование с примерами приложений на С++. - М., 1999.

  11. Т. Бадд. Объектно-ориентированное программирование в действии. - СПб., 2001.

  12. Р. Лафоре. Объектно-ориентированное программирование в С++. ­ - СПб., 2003.

  13. Д. Лукас. С++ под рукой. – М., 1999.

  14. Х. Дейтел. Как программировать на С++. – М., 2001.

  15. В.Войтенко, А.Морозов. С/С++: Теорія та практика. Навч.-метод. посібник. – Житомир, 2004.

  16. Т.А.Павловская, Ю.А.Щупак. С++. Объектно-ориентированное программирование: Практикум. – СПб., 2004.

  17. В.В.Лаптев, А.В.Морозов, А.В.Бокова. С++. Объектно-ориентированное программирование. Задачи и упражнения. ­ – СПб., 2007.

НАВЧАЛЬНЕ ВИДАННЯ

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