Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том1)" -> 66

Visual С++ 6. Полное руководство: В 2 т.(том1) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том1) — Бином, 2006. — 569 c.
Скачать (прямая ссылка): vicualcc2006t1.djvu
Предыдущая << 1 .. 60 61 62 63 64 65 < 66 > 67 68 69 70 71 72 .. 204 >> Следующая

#include <iostream.h>
class CExcept {
public:
CExcept (int ExCode) (
m_ExCode = ExCode; )
int GetExCode () (
return m_ExCode; )
private :
int m_ExCode;
);
void main () {
char Ch; try
«
cout « "at beginning of try block" « '\n';
cout « "throw 'char *' exception? (y/n) : "; cin » Ch; if (Ch == 'y' M Ch == 'Y')
throw "error description";
cout « "throw 'int' exception? (y/n) : "; cin » Ch; if (Ch == 'y' || Ch == T) throw 1;
cout « "throw 'class CExcept' exception? (y/n) : "; cin » Ch;
if (Ch == 'y' II Ch == 'Y') throw CExcept (5) ;
cout « "throw 'double' exception? (y/n) : "; cin » Ch; if (Ch == 'y' II Ch == 'Y') throw 3.1416;
cout « "at end of try block (no exceptions thrown)"
« '\n';
>
catch (char *ErrorMsg) {
cout << " 'char *' exception thrown; exception message:" « ErrorMsg « '\n';
}
catch (int ErrorCode) f
cout << " 'int' exception thrown; exception code: " « ErrorCode « '\n';
}
catch (CExcept Except) «
cout « " 'class CExcept' exception thrown; code:" « Except. GetExCode () « '\n';
}
catch (...) (
cout « "unknown type of exception thrown" << '\n'; )
cout « "after last catch block" « '\n'; )
В этой программе каждому исключению, сгенерированному в блоке try (кроме исключения с типом double, после которого управление передается универсальному обработчику), предоставляется специальный обработчик catch.
Если выбрать для инициации исключение с типом class CExcept, то программа создаст временный объект CExcept, передавая целочисленное значение в конструктор класса CExcept. Далее инициализируется результирующий объект
throw CExcept (5);
что приводит к копированию объекта в параметр Except соответствующего блока catch. В объект класса можно включить функции для передачи блоку catch информации об ошибке и для обработки ошибочной ситуации.
Заметьте: как только при выполнении программы возникает исключительная ситуация, последующие операторы внутри блока try не выполняются. После выполнения блока catch, управление передается оператору, следующему непосредственно за последним блоком catch, а программа завершается нормально.
Программирование блоков Catch
При разработке блока catch выбирается оптимальный вариант для обработки каждого исключения. На обработку исключения влияет как общий тип исключения, так и информация, передаваемая через параметр блока catch. Ниже перечислены три основных способа обработки исключений в блоке catch.
• Продолжение программы. Если проблема не сложная, то catch уведомляет о ней и самостоятельно исправляет ошибочную ситуацию. После передачи управления выполнение программы продолжается с оператора, следующего за последним блоком catch. Блок catch удаляет программные ресурсы (например, блоки памяти или дескрипторы файлов), которые должен был удалить блок try, если бы не было сгенерировано исключение. Как показано в параграфе "Размещение обработчиков исключений", любые локальные параметры, переменные или объекты, созданные в блоке try и находящиеся в области видимости в момент возникновения исключительной ситуации, удаляются автоматически.
Примечание
Механизм обработки исключения таков, что выполнение программы продолжается не с оператора, следующего за оператором, вызвавшим исключение. Выполнение возобновляется только с точки, находящейся за последним обработчиком catch. Поэтому принятая в С++ модель исключений называется нееозобновляемои (nonresumable).
• Завершение программы. Если проблема достаточно серьезна, обработчик catch выполняет требуемую очистку (например, закрывает дескрипторы файлов), сообщает об ошибке, а затем вызывает библиотечную функцию exit.
• Отказ от обработки исключения. Блок catch не обрабатывает исключение. Для этого используется оператор throw без конкретизирующего значения.
throw;
Этот оператор генерирует исключение с таким же типом и значением, как и первоначальное исключение, переданное catch. Поток управления разветвляется, и программа ищет другой обработчик исключения (или вызывает оператор terminate, если он не найден), как описано в параграфе "Обработчики вложенных исключений". Запомните: оператор throw используется без указания типа только в блоке catch или внутри вызываемой им функции.
Размещение обработчиков исключений
В приведенном ниже примере исключение генерируется оператором throw, находящемся в блоке try. Оператор throw также размешается в теле функции, вызываемой в блоке try, но управление по-прежнему "перепрыгивает" в присоединенный блок catch (если только throw не находится внутри вложенного блока try), как будет описано в следующем разделе.
Исключение может также генерироваться библиотечной функцией С++, вызываемой в программе. Например, многие из MFC-функций при обнаружении ошибки генерируют специфические типы исключений (гл. 9).
Примечание
Можно сгенерировать исключение с помощью оператора new (с объектом класса xaiioc) вместо передачи значения 0 при возникновении ошибки выделения памяти. Инструкции по этому методу находятся в следующих разделах справочной системы: Visual С++ Documentation, Reference, C/C++ Language and С++ Libraries, С++ Language Reference, Special Member Functions, The new and delete Operators, Handling Insufficient Memory Conditions. Если в программе используется библиотека MFC, то при ошибке в операторе new автоматически генерируется исключение, а не возвращается 0. Более подробная информация приведена во врезке, посвященной исключениям MFC, в конце гл. 9.
Предыдущая << 1 .. 60 61 62 63 64 65 < 66 > 67 68 69 70 71 72 .. 204 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100