|
Программирование >> Операторы преобразования типа
О Исключение класса bad typeid генерируется оператором typeid, предназначенным для идентификации типов во время выполнения. Если аргументом typeid является ноль или null-указатель, генерируется исключение. О Исключение класса bad exception предназначено для обработки непредвиденных исключений. В его обработке задействована функция unexpecbed(), которая вызывается при возникновении исключений, ие входящих в спецификацию исключений соответствующей функции (спецификации исключений рассматриваются на с. 32). Пример: class El class Е2 void f() throw(El) { throw ElO: throw E2(): Исключение типа E2 нарушает спецификацию исключений функции f(). В этом случае будет вызвана функция unexpected(), которая обычно передает управление функции terminateO для завершения программы. Но при включении в спецификацию исключений класса bad exception функция unexpected() обычно перезапускает исключение этого типа: class El class Е2 void f() throw(El,std::bad exception) Генерирует исключения типа El или bad exception для всех остальных типов исключений throw Е1С); Генерирует исключение типа Е1 throw Е2(): Вызывает функцию unexpectedC). } которая генерирует bad exception Итак, если спецификация исключений содержит класс bad exception, то функция unexpectedO может заменить исключением bad exceptlon любое исключение, не входящее в спецификацию. Классы исключений стандартной библиотеки Классы исключений стандартной библиотеки С++ обычно являются производными от класса logic error. К категории логических ошибок относятся ошибки, которые (по крайней мере, теоретически) можно предотвратить, например, до- Поведение функции unexpecced() можно переопределить. Тем не менее функция никогда не генерирует исключения, не указанные в спецификации исключений (если она есть). полнительной проверкой аргументов функции. В частности, к логическим ошибкам относится нарушение логических предусловий или инварианта класса Стандартная библиотека С++ содержит следующие классы логических ошибок: О исключение класса invalid argument сообщает о недопустимых значениях аргументов, например, когда битовые поля (массивы битов) инициализируются данными char, отличными от О и 1; О исключение класса length error сообщает о попытке выполнения операции, нарушающей ограничения на максимальный размер, например, при присоединении к строке слишком большого количества символов; О исключение класса out of range сообщает о том, что аргумент не входит в интервал допустимых значений, например, при использовании неправильного индекса в коллекциях наподобие массивов или в строках; О исключение класса domain error сообщает об ошибке выхода за пределы области допустимых значений. Кроме того, в подсистеме ввода-вывода определен специальный класс исключения ios base::failure. Это исключение обычно генерируется при изменении состояния потока вследствие ошибки или достижения конца файла. Поведение этого класса исключений подробно описано на с. 576, Классы исключений для внешних ошибок Исключения, производные от runtime error, сообщают о событиях, не контролируемых программой. В стандартную библиотеку С++ включены следующие классы ошибок времени вьшолнения: О исключение класса range error сообщает об ошибках выхода за пределы допустимого интервала во внутренних вычислениях; О исключение класса overfIow erTor сообщает о математическом переполнении; О исключение класса underfIow erTor сообщает о математической потере значимости. Исключения, генерируемые стандартной библиотекой Стандартная библиотека С++ тоже генерирует исключения классов гапде еггог out of range и invalid argument, а так как библиотека использует языковые средства и пользовательский код, эти исключения могут генерироваться еще и косвенно. В частности, любая операция выделения памяти может привести к исключению bad alloc. Реализации стандартной библиотеки могут содержать дополнительные классы исключений (определяемые иа одном уровне со стандартными классами или как производные от них). Однако использование нестандартных классов нарушает переносимость кода, так как замена реализации стандартной библиотеки нарушает работу программы. По этой причине задействовать нестандартные классы исключений нежелательно. Инвариантом класса называется утверждение, которое должно быть истинным при создании каждого экземпляра объекта класса и сохранять свое значение в течение всего времени жизни объекта. - Пргшеч. перев. Содержимое строки определяется реализацией. В частности, это может быть строка с многобайтовой кодировкой, завершенная нулем, интерпретируемая как w/string (класс w/string описан на с. 463). Строка, возвращаемая функцией what(), продолжает существовать вплоть до уничтожения объекта исключения, от которого она была получена Остальные члены стандартных классов исключений предназначены для создания, копирования, присваивания и уничтожения объектов исключений. Стандартные классы не имеют членов, содержахцих дополнительную информацию об исключении (помимо функции w/hat()). Например, не существует переносимых средств для получения информации о контексте исключения или неверного индекса при ошибке выхода из интервала. Переносимые возможности обработки дополнительной информации фактически ограничиваются выводом сообщения, полученного от what(): try { catch (const std::exception& error) { Вывод сообщения об ошибке, определяемого реализацией std::cerr error.whatO std::endl; Время жизни вознращаемого значения what() н исходном стандарте не оговорено. Для решения проблемы было внесено специа.?1Ы1ое предложение. Заголовочные файлы классов исключений Базовые классы exception и bad exception определяются в заголовочном файле <exception>. Класс bad alloc определяется в заголовочном файле <new>. Классы bad cast и bad typeid определены в заголовочном файле <typeinfo>. Класс ios base::faiiure определен в заголовочном файле <ios>. Все остальные классы определяются в заголовочном файле <stdexcept>. Члены классов исключений обработка исключений в секциях catch обычно производится через интерфейс исключений. Интерфейс всех стандартных классов исключений состоит из единственной функции what(). Функция возвращает дополнительную информацию (помимо типа исключения) в виде строки, завершенной нулевым байтом: namespace std { class exception { public: virtual const char* whatO const throwO;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |