Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 40030.doc
Скачиваний:
8
Добавлен:
30.04.2022
Размер:
178.18 Кб
Скачать

Практическая работа № 9 обработка исключений

1. Общие указания по работе

Цель работы: Приобрести навыки работы с обработкой исключений в среде C++.

2. Методические указания по их выполнению

2.1. Изучить теоретический материал по теме лабораторной работы.

Теоретическое введение

Язык С представляет программисту очень ограниченные возможности обработки исключений, возникших при работе программы. В этом отношении С++ намного развитее С. Здесь у программиста существенно большие возможности по непосредственной обработке исключений. Комитет по разработке стандартов С++ предоставил очень простую, но мощную форму обработки исключений. разберем основы обработки исключений в С++. Чтобы работать с исключениями в С++ нужно знать три ключевых слова:

-try (пытаться) - начало блока исключений;

-catch (поймать) - начало блока, "ловящего" исключение;

-throw (бросить) - ключевое слово, "создающее" ("возбуждающее") исключение.

Пример:

void func()

{

try

{

throw 1;

}

catch(int a)

{

cout << "Caught exception number: " << a << endl;

return;

}

cout << "No exception detected!" << endl;

return;

}

Если выполнить этот фрагмент кода, то получим следующий результат:

Caught exception number: 1

Если закомментировать строку throw 1, то функция выдаст такой результат:

No exception detected!

Когда возбуждается исключительная ситуация, программа просматривает стек функций до тех пор, пока не находит соответствующий catch. Если оператор catch не найден, STL будет обрабатывать исключение в стандартном обработчике, который делает все менее изящно, чем могли бы сделать вы, показывая какие-то непонятные (для конечного пользователя) сообщения и обычно аварийно завершая программу. Однако более важным моментом является то, что пока просматривается стек функций, вызываются деструкторы всех локальных классов, так что вам не нужно забодиться об освобождении памяти и т.п. Блок try-catch может содержать вложенные блоки try-catch и если не будет определено соответствующего оператора catch на текущем уровен вложения, исключение будет поймано на более высоком уровне. Единственная вещь, о которой вы должны помнить, - это то, что операторы, следующие за throw, никогда не выполнятся.

    1. Выполнить практические задания:

Создать класс, с методами производящими сложение, вычитание, деление и умножение элементов целочисленного типа (int). Генерировать исключения, при переполнении или делении на ноль. В основной программе реализовать обработчики для каждого исключения.

Библиографический список

  1. Стэнли Б. Липпман Язык программирования С++ / Б. Стэнли Липпман. –M.: - Невский Диалект, 2001. 1104 c.

  2. Брюс Эккель Введение в стандартный C++ / Эккель Брюс. М. – СПб.: Питер, 2002. 576 с.

  3. Бьерн Страуструп Программирование. Принципы и практика использования C++ / Бьерн Страуструп -М.: Вильямс, 2011. 1246 c.

Содержание

УКАЗАНИЯ ПО ТЕХНИКЕ БЕЗОПАСНОСТИ 0

ПРИ ВЫПОЛНЕНИИ ЛАБОРАТОРНЫХ РАБОТ 0

ПРАКТИЧЕСКАЯ РАБОТА № 1 1

ЛАБОРАТОРНАЯ РАБОТА № 2 5

ПРАКТИЧЕСКАЯ РАБОТА № 3 8

ПРАКТИЧЕСКАЯ РАБОТА № 4 11

ПРАКТИЧЕСКАЯ РАБОТА № 5 13

Абстрактные классы 13

Базовый класс иерархии типа обычно содержит ряд виртуальных функций, обеспечивающих динамическую типизацию. Часто в базовом классе эти виртуальные функции фиктивны и имеют пустое тело. Эти функции существуют как некоторая абстракция, конкретное значение им придается в производных классах. Такие функции называются чисто виртуальными функциями, то есть такими, тело которых, как правило, не определено. Общая форма записи чисто виртуальной функции имеет вид: 13

virtual прототип функции = 0; 13

Чисто виртуальная функция используется для того, чтобы отложить решение о реализации функции. То, что функция объявлена чисто виртуальной, требует, чтобы эта функция была определена во всех производных классах от класса, содержащего эту функцию. Если класс имеет хотя бы одну чисто виртуальную функцию, то он называется абстрактным. Для абстрактного класса нельзя создать объекты и он используется только как базовый класс для других классов. Если base – абстрактный класс, то для инструкций компилятор выдаст сообщение об ошибке. 13

base a; 14

base *p= new base; 14

В то же время вполне можно использовать инструкции вида 14

rect b; 14

base *p=&b; 14

base &p=b; 14

Чисто виртуальную функцию, как и просто виртуальную функцию, не обязательно переопределять в производных классах. При этом если в производном классе она не переопределена, то этот класс тоже будет абстрактным, и при попытке создать объект этого класса компилятор выдаст ошибку. Таким образом, забыть переопределить чисто виртуальную функцию невозможно. Абстрактный базовый класс навязывает определенный интерфейс всем производным от него классам. Главное назначение абстрактных классов – в определении интерфейса для некоторой иерархии классов. Класс можно сделать абстрактным, даже если все его функции определены. Это можно сделать, например, чтобы быть уверенным, что объект этого класса создан не будет. Обычно для этих целей выбирается деструктор. 14

class base 14

{ компоненты-данные 14

public: 14

virtual ~base() = 0; 14

компоненты-функции 14

} 14

base ::~base() 14

{реализация деструктора} 14

Объект класса base создать невозможно, в то же время деструктор его определен и будет вызван при разрушении объектов производных классов. Для иерархии типа полезно иметь базовый абстрактный класс. Он содержит общие свойства порожденных объектов и используется для объявления указателей, которые могут обращаться к объектам классов, порожденным от базового. 14

ПРАКТИЧЕСКАЯ РАБОТА № 6 16

ПРАКТИЧЕСКАЯ РАБОТА № 7 19

ПРАКТИЧЕСКАЯ РАБОТА № 8 22

ПРАКТИЧЕСКАЯ РАБОТА № 9 26

Язык С представляет программисту очень ограниченные возможности обработки исключений, возникших при работе программы. В этом отношении С++ намного развитее С. Здесь у программиста существенно большие возможности по непосредственной обработке исключений. Комитет по разработке стандартов С++ предоставил очень простую, но мощную форму обработки исключений. разберем основы обработки исключений в С++. Чтобы работать с исключениями в С++ нужно знать три ключевых слова: 26

-try (пытаться) - начало блока исключений; 26

-catch (поймать) - начало блока, "ловящего" исключение; 26

-throw (бросить) - ключевое слово, "создающее" ("возбуждающее") исключение. 26

Пример: 26

void func() 26

{ 26

try 26

{ 26

throw 1; 26

} 26

catch(int a) 26

{ 27

cout << "Caught exception number: " << a << endl; 27

return; 27

} 27

cout << "No exception detected!" << endl; 27

return; 27

} 27

Если выполнить этот фрагмент кода, то получим следующий результат: 27

Caught exception number: 1 27

Если закомментировать строку throw 1, то функция выдаст такой результат: 27

No exception detected! 27

Когда возбуждается исключительная ситуация, программа просматривает стек функций до тех пор, пока не находит соответствующий catch. Если оператор catch не найден, STL будет обрабатывать исключение в стандартном обработчике, который делает все менее изящно, чем могли бы сделать вы, показывая какие-то непонятные (для конечного пользователя) сообщения и обычно аварийно завершая программу. Однако более важным моментом является то, что пока просматривается стек функций, вызываются деструкторы всех локальных классов, так что вам не нужно забодиться об освобождении памяти и т.п. Блок try-catch может содержать вложенные блоки try-catch и если не будет определено соответствующего оператора catch на текущем уровен вложения, исключение будет поймано на более высоком уровне. Единственная вещь, о которой вы должны помнить, - это то, что операторы, следующие за throw, никогда не выполнятся. 27

БИБЛИОГРАФИЧЕСКИЙ СПИСОК 28

МЕТОДИЧЕСКИЕ УКАЗАНИЯ

для практических занятий

по дисциплине "Языки программирования" для студентов специальностей 090301 "Компьютерная

безопасность"; 090303 «Информационная безопасность

автоматизированных систем» очной формы обучения

Составитель

Карпеев Дмитрий Олегович

В авторской редакции

Подписано к изданию 29.03.2012.

Уч.-изд. л. 1,7. «С»

ФГБОУ ВПО «Воронежский государственный технический университет»

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