Исключения и наследование

От одного общего класса исключений может производиться несколько

различных классов, о чем говорилось в разделе 16.3, где мы создали класс

DivideByZeroException в качестве производного от класса exception. Если

catch-обработчик перехватывает указатель или ссылку на объект исключения

базового класса, он может также перехватывать указатели или ссылки на все

объекты классов, являющихся открытыми производными этого базового

класса, что позволяет полиморфно обрабатывать родственные ошибки.

Обработка отказов операции new

Стандарт C++ специфицирует, что когда операция new терпит неудачу, она

выбрасывает исключение bad_alloc (определенное в заголовочном файле

<new>). Однако некоторые компиляторы не совместимы в этом отношении со

стандартным C++ и реализуют версию new, которая при отказе возвращает 0.

Например, Microsoft Visual Studio.NET при отказе new выбрасывает

исключение bad_alloc, в то время как Microsoft Visual C++ 6.0 возвращает 0.

Компиляторы по-разному поддерживают обработку отказов new. Многие

старые компиляторы по умолчанию возвращают 0. Некоторые поддерживают

исключения, если включить заголовочный файл <new> (или <new.h>).

Другие по умолчанию выбрасывают bad_alloc вне зависимости от того, включен

или нет файл <new>. Справьтесь в документации по вашему компилятору,

каким образом в нем осуществляется поддержка обработки ошибок new.

В этом разделе мы представим три примера отказов операции new. В

первом из них операция при отказе возвращает 0. Во втором примере

используется версия new, при отказе выбрасывающая исключение bad_alloc. Третий

пример использует для обработки отказов функцию set__new_handler.

[Замечание. Примеры на рис. 16.5-16.7 выделяют очень большие объемы памяти,

поэтому ваш компьютер может стать довольно медлительным.]


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: