Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2-й семестр / Лекции / Тема 5. Обработка исключений в С++, Java и C#.ppt
Скачиваний:
136
Добавлен:
12.03.2016
Размер:
1.36 Mб
Скачать

Программирование Тема 5 Обработка исключений

в С++, Java и C#

1

Обработка исключений в C++

Операторы для работы с исключениями

try { /*контролируемый блок*/

[ throw выражение; ]

}

catch (тип параметра имя параметра) { /* блок обработки */ }

catch (тип параметра)

{ /* блок обработки */ }

catch (…)

{ /* блок обработки */ }

2

Обработка исключений в C++

Исключения, или исключительные ситуации - это события, нарушающие нормальный ход выполнения программы.

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

в С++ для работы с исключениями используются следующие операторы: try (контролировать), throw (выбрасывать), catch (перехватывать). Синтаксис записи операторов показан на слайде 2.

Оператор try выделяет часть программы, в которой может возникнуть исключение.

Когда при выполнении программы происходит исключительная ситуация, то программа должна создать специальный объект-исключение. Объект-исключение часто называют просто исключением, а процесс его создания выбрасыванием исключения (exception throwing).

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

Исключение может выбрасываться в функциях, прямо или косвенно вложенных в try-блок. Контролируемый блок, помимо функции контроля, обладает функциями обычного блока: все переменные, объявленные внутри него, являются локальными в этом блоке и не видны вне его.

После блока try обязательно прописывается один или несколько операторов catch.

Оператор catch определяет обработчик исключения, которому передается управление в случае возникновения исключения. Управление передается тому обработчику тип параметра которого совпадает с типом объекта-исключения. Если на месте параметра в обработчике catch написано многоточие, то такой обработчик перехватывает все исключения. Оператор catch с параметром- многоточием всегда должен быть последним.

3

Обработка исключений в C++

Варианты создания объекта класса исключения

try { …

if (/*условие возникновения исключения*/)

{ TException e; //создание объекта e класса

// исключения TException

throw ex;

или

throw TException(); //создание безымянного

// объекта класса исключения TException

}

}

Способы передачи объекта класса исключения в обработчик:

catch (TException e) // по значению catch (TException& e) // по ссылке

catch (const TException& e) // по конст. ссылке catch (TException *e) // по указателю

catch (const TException *e) // по конст. указателю

4

Обработка исключений в C++

В С++ порождаемое исключение может быть константой или переменной любого встроенного или пользовательского типа, но чаще всего – это объект класса исключения.

На слайде 4 показаны способы создания объекта класса исключения и способы передачи объекта класса исключения в обработчик.

Работа конструкции try...catch напоминает работу оператора switch. Операторы обработчики похожи на альтернативы case, а блок catch с многоточием соответствует альтернативе default оператора- переключателя. Если в блоке try возникает исключение, то начинается сравнение типа сгенерированного исключения и типов параметров в секциях-обработчиках. Выполняется тот блок catch, тип параметра которого совпал с типом исключения. Если такого типа не найдено, выполняется блок catch с многоточием. Если же такого блока в текущем списке обработчиков не обнаруживается, то ищется другой список обработчиков в вызывающей функции. Этот поиск продолжается вплоть до функции main(). Если же и там не обнаружится нужного блока catch, то вызывается стандартная функция завершения terminate(), которая вызывает функцию abort().

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

После выполнения операторов блока catch выполняются операторы, расположенные после всей конструкции try...catch. Если во время работы в блоке try не обнаружено исключительной ситуации, то все блоки catch пропускаются и программа продолжает выполнение с первого после всех блоков catch оператора.

5

Обработка исключений в C++

Пример 1. Передача в обработчик catch целого числа

6

Обработка исключений в C++

Пример 2: Передача в обработчик catch символьной строки

7

Обработка исключений в C++

Пример 3: Выбрасывание исключения в функции

8

Обработка исключений в C++

Пример 4: Передача в обработчик catch объекта класса исключения

9

Обработка исключений в C++

Пример 4: Передача в обработчик catch объекта класса исключения

10

Обработка исключений в C++

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

где р = (а + b + с)/2 — полупериметр треугольника. Квадратный корень представляет собой формулу Герона для вычисления площади треугольника. Таким образом, нам надо проверить, что:

ни один из параметров (сторона треугольника) не меньше нуля и не равен нулю;

выполняются неравенства треугольника для любых сочетаний сторон.

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

Для описания исключения создается класс исключения, специализированный под задачу. В классе- исключении объявляются поля: стороны треугольника, сообщение об ошибке и определен конструктор с параметрами.

Передавать объект-исключение в обработчик catch будем по константной ссылке.

11

Обработка исключений в C++

Классы стандартных исключений class exception {//... };

class logic_error : public exception {//... }; class domain_error : public logic_error {//... };

class invalid_argument : public logic_error {//..}; class length_error : public logic_error {//...}; class out_of_range : public logic_error {//...};

class runtime_error : public exception {//... }; class range_error : public runtime_error {//...}; class overflow_error : public runtime_error {//...}; class underflow_error : public runtime_error {//...};

class bad_alloc : public exception {//... }; class bad_cast : public exception {//... }; class bad_tipeid : public exception {//... }; class bad_exception : public exception {//... };

class ios_base::failure : public exception {//... };

12

Обработка исключений в C++

В языке C++ в составе стандартной библиотеки реализован ряд стандартных исключений, которые организованы в иерархию классов (см. слайд).

Мы можем определять собственные классы исключений, унаследовав их от класса exception.Все стандартные классы исключений являются наследниками класса exception.

Названия классов logic_error и runtime_error условны. Предполагается, что исключения первого типа сигнализируют об ошибках в логике программы, например о невыполнении некоторого условия. Категория runtime_error — это ошибки, которые возникают в результате непредвиденных обстоятельств при выполнении программы, например переполнение при операциях с дробными числами.

Эти исключения (logic_error и runtime_error) программа должна генерировать сама оператором throw. А вот следующие 5 стандартных исключений генерируют различные механизмы C++.

Исключение bad__alloc генерирует операция new (или new[]), если запрос на память не может быть удовлетворен.

Исключения bad__cast и bad_typeid генерируются механизмом RTTI (Run-Time Type Identification — динамическая идентификация типов).

Исключение ios__base::failure генерируется системой ввода-вывода.

Исключение bad_exception играет важную роль при нарушении функцией спецификации исключения.

Стандартные исключения включают функцию-метод what(), которая выдает строку-сообщение об ошибке.

13

Обработка исключений в C++

Пример 5: Использование стандартного класса исключения

14

Обработка исключений в C++

Пример 6: Механизмы обработки исключений. Создание класса исключения на основе класса std::exeption

15

Обработка исключений в C++

Пример 6: Механизмы обработки исключений. Создание класса исключения на основе класса std::exeption

16

Обработка исключений в C++

Пример 6: Механизмы обработки исключений. Создание класса исключения на основе класса std::exeption

17

Обработка исключений в C++

Пример 6: Механизмы обработки исключений. Создание класса исключения на основе класса std::exeption

18