Программирование в среде Windows, обработка исключительных ситуаций, страница 6

•   Оператор высвобождения памяти, выделенной под floatarray, дублируется.

•   Объявление переменной retval вынесено за пределы блока try, так что эта переменная остается в области видимости и после выполнения блока try.

•   Переменная retval теперь должна быть проинициализирована значением по умолчанию.

В результате всего экземпляр класс ВigObject с именем bigarray корректно и просто удаляется без дополнительных усилий, поскольку соответствующий деструктор вызывается автоматически. Это выполняется независимо от того, какой функцией он был создан в памяти или в каком месте программы вызвано исключение. Поэтому при разработке программы, работающей с исключениями, рекомендуется помещать все объекты, память под которые выделяется из кучи, в классы типа BigObject. Класс ВigObject использует управляемый указатель (managed pointer); когда объект класса BigObject, скажем, bigarray, выходит за пределы области видимости, память, на которую он указывает, автоматически освобождается.

Обработка исключений разных типов. Поскольку очень часто в определенных фрагментах программы возникает необходимость использовать более одного типа исключений, допускается с одним блоком try использовать несколько различных блоков catch. К примеру, может потребоваться перехватывать исключения как типа CException, так и типа char*. Поскольку блок catch обрабатывает только один конкретный тип передаваемого ему параметра исключения, потребуется два различных блока для обработки параметров исключений типа CException и типа char*. Имеется возможность так определить блок catch, что он будет перехватывать любой тип исключений, которые до данного момента еще не были перехвачены. Это происходит, если в качестве его аргумента вместо параметра конкретного типа помещается многоточие (...). Проблема при использовании такого многоцелевого блока catch заключается в том, что получить доступ к параметру перехваченного исключения будет невозможно и, следовательно, придется обрабатывать исключение некоторым общим способом..

В листинге ниже представлен текст программы, в которой, в зависимости от введенных пользователем данных, выбрасываются исключения трех различных типов. В реальной программе следует использовать исключения при обработке ошибок во введенных пользователем данных. Это слишком медленный механизм, и проверка введенной пользователем информации, как правило, должна быть реализована посредством других, более эффективных методов.