Составители:
{
...
}
catch( CUserException *e ) // пользовательское исключение
{
...
}
catch( CException *e ) // данный блок должен следовать после
// предыдущих блоков,
{ // иначе компилятор выдаст код ошибки
...
}
catch (...) // перехват всех исключений!!!
{
...
}
В этом примере все классы, производные от класса CException, включены в блоки
catch. Поскольку CException представляет собой абстрактный базовый класс, вы не мо-
жете напрямую создавать производные от него классы - пользовательские классы могут
быть порождены только от классов, производных от CException. Если вы хотите создать
собственное исключение типа CException, воспользуйтесь в качестве модели одним из
производных классов. Кроме того, при создании производного класса необходимо ука-
зать макрокоманду IMPLEMENT_DYNAMIC, организующую поддержку динамической
проверки типов.
Наряду с тем, что вы можете явно указать производные от CException классы в
операторах catch, в качестве аргумента этого оператора можно задать и троеточие:
catch(...). При этом блок catch будет перехватывать исключения всех типов, в том числе
исключения языка С и исключения, порожденные системой и приложениями. К ним от-
носятся также, исключения, связанные с нарушением защиты памяти, делением на ноль,
недопустимыми операциями с плавающей запятой.
Следует обратить внимание, что подобно обработчику CException, который дол-
жен следовать после всех подпрограмм обработки, основанных на классах CException,
оператор catch (...) всегда должен быть последним обработчиком в своем блоке try.
Задача поиска процедуры обработки исключения становится более сложной, когда
процесс находится в состоянии отладки, поскольку операционная система передает
управление отладчику еще до начала поиска обработчиков, находящихся в самой про-
грамме. Обычно отладчик использует этот режим для обработки пошаговых и контроль-
ных исключений, что дает возможность пользователю проанализировать контекст про-
граммы перед возобновлением ее выполнения.
Если отладчик принимает решение не обрабатывать исключения на стадии раннего
оповещения, система возвращается к процессу и ищет обработчик исключений внутри
него самого. При условии, что процесс также отвергает исключение, система дает от-
ладчику повторную возможность обработать эту, теперь уже более серьезную, ситуа-
цию. Но если отладчик отвергает исключение повторно, система берет управление на
себя и вырабатывает собственный ответ, который обычно заключается в приказе унич-
тожить процесс.
Вместо того чтобы непосредственно применять блоки try/catch, можно структури-
ровать свою программу с помощью макрокоманд обработки исключений. В этом случае
необходимо начать с макрокоманды TRY, которая устанавливает блок TRY, отмечаю-
щий потенциально опасный фрагмент программы.
90
{
...
}
catch( CUserException *e ) // пользовательское исключение
{
...
}
catch( CException *e ) // данный блок должен следовать после
// предыдущих блоков,
{ // иначе компилятор выдаст код ошибки
...
}
catch (...) // перехват всех исключений!!!
{
...
}
В этом примере все классы, производные от класса CException, включены в блоки
catch. Поскольку CException представляет собой абстрактный базовый класс, вы не мо-
жете напрямую создавать производные от него классы - пользовательские классы могут
быть порождены только от классов, производных от CException. Если вы хотите создать
собственное исключение типа CException, воспользуйтесь в качестве модели одним из
производных классов. Кроме того, при создании производного класса необходимо ука-
зать макрокоманду IMPLEMENT_DYNAMIC, организующую поддержку динамической
проверки типов.
Наряду с тем, что вы можете явно указать производные от CException классы в
операторах catch, в качестве аргумента этого оператора можно задать и троеточие:
catch(...). При этом блок catch будет перехватывать исключения всех типов, в том числе
исключения языка С и исключения, порожденные системой и приложениями. К ним от-
носятся также, исключения, связанные с нарушением защиты памяти, делением на ноль,
недопустимыми операциями с плавающей запятой.
Следует обратить внимание, что подобно обработчику CException, который дол-
жен следовать после всех подпрограмм обработки, основанных на классах CException,
оператор catch (...) всегда должен быть последним обработчиком в своем блоке try.
Задача поиска процедуры обработки исключения становится более сложной, когда
процесс находится в состоянии отладки, поскольку операционная система передает
управление отладчику еще до начала поиска обработчиков, находящихся в самой про-
грамме. Обычно отладчик использует этот режим для обработки пошаговых и контроль-
ных исключений, что дает возможность пользователю проанализировать контекст про-
граммы перед возобновлением ее выполнения.
Если отладчик принимает решение не обрабатывать исключения на стадии раннего
оповещения, система возвращается к процессу и ищет обработчик исключений внутри
него самого. При условии, что процесс также отвергает исключение, система дает от-
ладчику повторную возможность обработать эту, теперь уже более серьезную, ситуа-
цию. Но если отладчик отвергает исключение повторно, система берет управление на
себя и вырабатывает собственный ответ, который обычно заключается в приказе унич-
тожить процесс.
Вместо того чтобы непосредственно применять блоки try/catch, можно структури-
ровать свою программу с помощью макрокоманд обработки исключений. В этом случае
необходимо начать с макрокоманды TRY, которая устанавливает блок TRY, отмечаю-
щий потенциально опасный фрагмент программы.
90
Страницы
- « первая
- ‹ предыдущая
- …
- 86
- 87
- 88
- 89
- 90
- …
- следующая ›
- последняя »
