Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Основные теоретические положения




 

 

1. Определение исключения

 

Обычно исключение – это возникающая в программе нештатная ситуация, с которой программа не может справиться. Например, при делении на ноль выполнение программы аварийно завершается системой. С++ дает возможность восстанавливать программу из ошибочных ситуаций и продолжать ее выполнение.

Код на С++ позволяет напрямую возбуждать исключения в пробном блоке с помощью запускающего выражения throw. Исключения обрабатываются с помощью вызова надлежащего обработчика, выбираемого из списка обработчиков, который следует сразу за пробным блоком.

 

 

2. Запуск исключений

 

Синтаксически выражение throw может принимать две формы:

throw и throw выражение.

Конструкция «throw выражение» возбуждает исключение в пробном блоке. Для выбора инструкции catch, которая обрабатывает исключение, используется самый внутренний пробный блок (try-блок), в котором возбуждено исключение. А throw без аргумента может использоваться внутри catch для перезапуска текущего исключения или для вызова из недр первого обработчика второго обработчика при дальнейшей обработке исключения.

Запущенное с помощью throw выражение - это временный статический объект, существующий до тех пор, пока не будет произведен выход из обработчика исключения. Выражение отлавливается обработчиком, который может использовать этот временный объект. Неотловленное выражение завершает программу.

Целое значение, запущенное throw i, существует, пока не произойдет выход из обработчика catch(int n) с целой сигнатурой. Это выражение доступно для использования внутри обработчика как его аргумент.

Перезапуск исключений осуществляется таким образом:

 

 

catch (int n)

{

……….

throw; //перезапуск

}

 

 

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

 

3. Пробные блоки try

 

Синтаксически блок try выглядит так:

 

 

try

составная_инструкция

список_обработчиков

 

 

Блок try является контекстом для определения того, какие обработчики вызываются при возбуждении исключения. Порядок, в котором определены обработчики, задает очередность проверки обработчиков подходящего типа для возбуждения исключения. Например:

 

 

try {

……….

throw (“SOS”);

.………

io_condition eof (argv[i]);

throw (eof);

……….

}

catch(const char*) {………}

catch(io_condition& x) {……….}

 

 

Выражение throw соответствует перехватчику catch, если оно:

- точно совпадает с типом catch;

- является производным типом открытого базового класса типа обработчика;

- является типом возбуждаемого объекта, который (тип) может быть преобразован к типу указателя, являющегося аргументом catch.

 

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

 

 

catch (void*) //соответствует любому char*

catch (char*)

catch (BaseTypeError&) //в том числе и DerivedTypeError

catch (DerivedTypeError&)

//предполагается, что класс DerivedTypeError

//является производным от BaseTypeError

 

 

4. Обработчики

 

Синтаксически обработчик имеет вид:

catch (формальный_аргумент)

составная_конструкция

 

 

Обработчик catch выглядит как объявление функции одного аргумента без возвращаемого типа. Например:

 

 

catch (const char* message)

{

cerr << message << endl;

exit (1);

}

catch (…) //будет выполнено действие по умолчанию

{

cerr << “Вот и все!” << endl;

abort();

}

 

 

Допустима эллиптическая (…) сигнатура, совпадающая с аргументом любого типа. Кроме того, формальный аргумент может быть абстрактным объявлением, то есть может не задавать имя переменной, а только предоставлять информацию о типе.

 

 

5. Спецификация исключения

Синтаксически спецификация исключения является частью объявления и определения функции и имеет следующий вид:

 

 

заголовок_функции throw (список_типов)

 

 

Здесь список_типов – это список типов, которые может иметь выражение throw внутри функции. В объявлении и в определении функции спецификация исключения должна записываться одинаково.

Если список пуст, компилятор полагает, что функцией не будет выполняться никакой throw (ни прямо, ни косвенно).

Если спецификация исключения опущена, то предполагается, что такой функцией может быть возбуждено произвольное исключение. Например:

 

 

void foo() throw(int, over_flow);

void noex(int i) throw();

 

 

Нарушение спецификаций исключений приводит к ошибкам на этапе выполнения. Эти ошибки отлавливаются функцией unexpected().

 

 

6. Функции terminate() и unexpected()

 

Предоставляемая системой функция terminate() вызывается, если не было задано ни одного обработчика, знающего, как обращаться с исключением. По умолчанию вызывается функция abort(), которая немедленно завершает программу и возвращает управление операционной системе. С помощью set_terminate() может быть задано какое-нибудь другое действие; тем самым задается обработчик. Объявления упомянутых функций находятся в except и except.h.

Предоставляемая системой функция unexpected() вызывается, когда она возбудила исключение, которое отсутствует в ее списке спецификации исключений. По умолчанию вызывается функция terminate(). Или же можно задать обработчик, воспользовавшись функцией set_terminate().

 

7. Стандартные библиотечные исключения

 

Исключения стандартной библиотеки наследуются от базового класса exception. Два производных класса – это logic_error (логическая ошибка) и runtime_error (ошибка выполнения). Типы логических ошибок включают ошибки bad_cast (ошибка приведения), out_of_range (вне диапазона) и bad_typeid (ошибка оператора typeid), которые должны запускаться в ситуациях, соответствующих названиям перечисленных классов. Типы ошибок на этапе выполнения включают: range_error (ошибка диапазона), overflow_error (переполнение) и bad_alloc (ошибка выделения памяти).

Базовый класс определяет следующую виртуальную функцию, которая служит для возвращения содержательного диагностического сообщения:

 

 

virtual const char* exception::what() const throw();

 

 

Чтобы предоставлять дополнительные полезные сообщения, эта функция-член должна быть определена в каждом производном классе. Пустой список спецификации исключений показывает, что сама функция не запускает исключение.

 

 

Задание

 

Используя модифицированный АТД, обработайте все возможные исключительные ситуации.

 

 

Контрольные вопросы

 

 

1. Дайте определение исключения.

2. В каком блоке описывается список обработчиков для возбужденного исключения?

3. Опишите синтаксис обработчика исключения.

4. Что такое спецификация исключения?

5. Для каких целей используется функция unexpected?

Список литературы

 

 

1. Архангельский А.Я. Программирование в С++ Builder 5. – М.: БИНОМ, 2000.

2. Бадд Т. Объектно-ориентированное программирование в действии / Пер. с англ. – СПб.: Питер, 1997.

3. Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на С++ / Пер. с англ. – 2-е изд. – М.; СПб., 2000.

4. Керниган Б., Ритчи Д. Язык программирования Си / Пер. с англ. – 3-е изд., испр. – СПб., 2001.

5. Павловская Т.А. С/С++. Программирование на языке высокого уровня: Учебник для вузов. – СПб., 2003.

6. Павловская Т.А. С/С++. Структурное программирование: Практикум. – СПб., 2004.

7. Павловская Т.А., Щупак Ю.А. С/С++: Программирование на языке высокого уровня: Структурное программирование: Практикум: Учеб. пособие для вузов. – СПб.: Питер, 2002.

8. Подбельский В.В. Язык С++: Учеб. пособие для вузов. – 5-е изд. – М.: Финансы и статистика, 2001.

9. Подбельский В.В., Фомин С.С. Программирование на языке Си: Учеб. пособие для вузов. – 2-е изд., доп. – М.: Финансы и статистика, 2002.

10. Пол А. Объектно-ориентированное программирование на С++ / Пер. с англ. – 2-е изд. – СПб.; М., 1999.

11. Страуструп Б. Язык программирования С++ / Пер. с англ. – 3-е изд. – СПб.; М., 1999.

12. Фридман А.Л. Основы объектно-ориентированного программирования на языке С++. – М., 1999.

13. Фридман А.Л. Основы объектно-ориентированной разработки программных систем. – М.: Финансы и статистика, 2000.

 

 

Оглавление

 

 

Введение....................................................................................................... 3

Лабораторная работа 6. Перегрузка операторов................................. 4

Лабораторная работа 7. Программирование шаблонных классов и

функций............................................................................................................... 6

Лабораторная работа 8. Программная реализация отношения прос-

того наследования.............................................................................................. 12

Лабораторная работа 9. Программная реализация отношения мно-

жественного наследования................................................................................ 16

Лабораторная работа 10. Программирование обработки исключите-

льных ситуаций................................................................................................... 20

Список литературы ...................................................................................... 26

 

 

Редактор Н.C. Менькина

Компьютерная верстка Т.С. Камыгиной

Лицензия А № 165724 от 11.04.06 г.

 
 


Подписано к печати г. Тир. 25.

Уч.-изд. л. 0,83. Формат 60 ´ 84 1/16. Усл. п. л. 1,5.

Гарнитура Таймс. Зак..

 

ГОУ ВПО «Череповецкий государственный университет»

162600 г. Череповец, пр. Луначарского, 5.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...