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