Добавил:
t.me Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 семестр / Обработка исключений

.pdf
Скачиваний:
2
Добавлен:
16.07.2023
Размер:
945.1 Кб
Скачать

Обработка исключений в 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