Вот более конкретный пример блока
Вот более конкретный пример блока try-except
DWORD Funcmeister1()
{
DWORD dwTemp
// 1 Что-то делаем здесь
...
__try
{
// 2 Выполняем какую-то операцию
dwTemp = 0;
}
__except (EXCEPTION_EXECUTE HANDLER)
{
// обрабатываем исключение этит код никогда не выполняется
...
}
// 3 Продолжаем что то делать return(dwTemp)
}
В блоке try функции Funcmetsterl мы просто присваиваем 0 переменной dwTemp Такая операция не приведет к исключению, и поэтому код в блоке except никогда не выполняется Обратите внимание на такую особенность конструкция try-finally ведет себя иначе После того как переменной dwTemp присваивается 0, следующим испол няемым оператором оказывается return
Хотя ставить операторы return, goto, continue и break в блоке try обработчика за вершения настоятельно не рекомендуется, их применение в этом блоке не приводит к снижению быстродействия кода или к увеличению сго размера Использование этих операторов в блоке try, связанном с блоком except, не вызовет таких неприятностей, как локальная раскрутка
Попробуем модифицировать нашу функцию и посмотрим, что будет
DWORD Funcmeister2()
{
DWORD dwTemp = 0;
// 1 Нто-то делаем здесь
...
__try
{
// 2 Выполняем какую-то операцию
dwTemp = 5 / dwTemp;
// генерирурт исключение
dwTemp += 10;
// никогда не выполняется
}
__except ( /* 3 Проверяем фильтр */ EXCEPTION_EXECUTE_HANDLER)
{
// 4. Обрабатываем исключение
MessageBeep(0)
...
}
// 5 Продолжаем что-то делать
return(dwТemp); }
Рис. 24-1. Так система обрабатывает исключения
Инструкция внутри блока try функции Funcmeister2 пытается поделить 5 на 0. Перехватив это событие, процессор возбуждает аппаратное исключение Тогда опе рационная система ищст начало блока except и проверяет выражение, указанное в качестве фильтра исключении, оно должно дать один из трех идентификаторов, оп ределенных в заголовочном Windows-файле Exept.h
Идентификатор | Значение |
EXCEPTION_EXECUTE_HANDLER | 1 |
EXCEPTION_CONTINUE_SEARCH | 0 |
EXCEPTION_CONTINUE_EXECUTION | -1 |