Глава 22. Обработка исключительных ситуаций_______________________615

TestFunction(true) ;

) catch(SimpleExceptions) {

cout « "Перехвачена SimpleException!" « endl;

} catch(Pets) {

cout « "Перехвачена Pet!" « endl;

}

// Второй пример — перехватить SimpleException(??) .try (

TestFunction(false);

} catch (SimpleExceptions.) {

cout « "Перехвачена SimpleException!" « endi;

} ' ' catch(Pet&) {

cout « "Перехвачена Pet!" « endl;

}

\

Давайте взглянем на то, что здесь происходит. Основа этого примера идентична листингу 22.22; тестовая функция вызывается дважды, причем второй вызов генерирует исключительную ситуацию, не входящую в спецификацию. В этой версии программы, однако, мы установили новый неожиданный обработчик, который всегда генерирует исключительную ситуацию типа Dog. Так как класс Dog наследуется от класса pet, эта исключительная ситуация удовлетворяет спецификации, и новая исключительная ситуация Dog успешно генерируется и перехватывается.

Переносимые исключительные ситуации

Операционные системы Windows NT и Windows 95 поддерживают инфраструктуру обработки ошибок, называющуюся структурной обработкой исключительных ситуаций (structured exception handling). Заметим, что, хотя структурная обработка исключительных ситуаций совместима с обработкой исключительных ситуаций в Borland C++, это не одно и то же. Структурную обработку исключительных ситуаций помимо C++ могут использовать и другие языки программирования (в особенности С); в то время как обработка исключительных ситуаций C++ является эксклюзивным средством именно этого языка. >

Если вы хотите, чтобы ваши программы на C++ были переносимыми, не используйте в них структурную обработку исключительных ситуаций. Иногда, однако, возникает необходимость добавить в программу на C++ фрагменты, написанные на С; в этом случае желательно иметь возможность обрабатывать оба вида исключительных ситуаций. Так как обработчик