В языке С++ в составе стандартной библиотеки реализован ряд стандартна исключений, которые организованы в иерархию классов (см. п. п. 18.6 и 19.1 в [1]). Иерархическое представление часто бывает очень полезно, так как позволяет разбить задачу на части, повысить понимание и упростить реализацию. В этом случае задействуется третий механизм объектно-ориентированного программирования — наследование. Подробности наследования мы изучим в следующей главе, а здесь рассмотрим простейший случай организации исключений.
При реализации класса ТАггау с генерацией исключений (см. листинг 7.8) были
определены три независимых типа исключений: bad_Range, bad_Index и bad_Size.
Но все они имеют нечто общее: эти исключения генерируются в классе ТАггау.
Хотелось бы как-то обозначить этот факт явным образом. Это можно сделать,
используя механизм наследования: мы объявим класс TArray_exception, а остальные классы объявим его наследниками:
class TArray_exception {}; // базовый класс class bad_Range: public TArray_exception {}; // класс-потомок class bad_Index: public TArray__exception {}; // класс-потомок class bad_Size : public TArray_exception {}; // класс-потомок
Мы объявили общий тип исключений, связанных с классом ТАггау, а затем определили ряд более специализированных подвидов типа TArray_exception. Тем самым мы получили возможность все исключения, связанные с классом ТАггау, перехватывать и обрабатывать с помощью единственной секции-ловушки с типом параметра TArray_exception. Никто, однако, не запрещает использовать и специализированные исключения. Естественно, если нам потребуется задать несколько секций-ловушек для обработки исключений класса ТАггау, то блок с типом исключения TArray__exception должен стоять последним, так как это — исключение общего вида.
Несколько более сложную структуру (см. п. 19.1 в [1]) имеет иерархия стандартных исключений (листинг 7.14).
Листинг 7.14. Иерархия стандартных исключений
class exception {II... }; class logic_error : public exception {II... }; class domain_error : public logic_error {II... }; class invalid_argument : public logic_error {II... }; class length_error : public logic_error {II... }; class out_of_range : public logic_error {II... }; class runtime_error : public exception {II... }; class range_error : public runtime_error {II... }; class overtlow_error : public runtime_error { class underflow_error : public runtime_error {II... }; class bad_alloc : public exception {II... }; class bad_cast : public exception {II... }; class bad_tipeid : public exception {II... }; class bad__exception : public exception {II... }; class ios_base::failure : public exception {II... }:
Эта иерархия служит основой для создания собственных исключений и иерархий исключений. Мы можем определять собственные исключения, унаследовав их от класса exception. Для работы со стандартными исключениями в программе надо прописать оператор
#include<stdexcept>
ПРИМЕЧАНИЕ
Так как обработка исключений во время выполнения программы сопровождается расходами времени и памяти, в интегрированной среде, как правило, необходимо включить соответствующий режим, разрешающий обработку исключений.
Названия производных классов logic_error и runtime_error, в общем-то, условны. Предполагается, что исключения первого типа сигнализируют об ошибках в логике программы, например о невыполнении некоторого условия. Категория runtime_error — это ошибки, которые возникают в результате непредвиденных обстоятельств при выполнении программы, например переполнение при операциях с дробными числами.
Эти исключения программа должна генерировать сама оператором throw. А вот следующие 5 стандартных исключений генерируют различные механизмы С++. ПРИМЕЧАНИЕ <
Мы тоже можем использовать эти исключения в операторе throw явным образом, однако так делать не рекомендуется во избежание путаницы.
Как уже было сказано, исключение bad__alloc (см. п. п. 18.4.2 в [1]) генерирует операция new (или new[]), если запрос на память не может быть удовлетворен. Исключения bad__cast (см. п. п. 18.5.2 в [1]) и bad_typeid (см. п. п. 18.5.3 в [1]) генерируются механизмом RTTI (Run-Time Type Identification — динамическая идентификация типов). Естественно, исключение ios__base: :failure (см. п. п. 27.4.2.1.1 в [1]) генерируется системой ввода-вывода. Исключение bad_ except i on (см. п. it. 18.6.2.1 в [1]) играет важную роль при нарушении функцией спецификации исключения (см. далее).
Опубликовал Kest
November 11 2013 01:05:15 ·
0 Комментариев ·
6056 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.