Синтаксис обработчика исключений
__try и __except ключевое слово используются для создания обработчика исключений на основе кадра. В следующем примере показана структура обработчика исключений.
__try
{
// guarded body of code
}
__except (filter-expression)
{
// exception-handler block
}
Обратите внимание, что блок __try и блок обработчика исключений требуют фигурных скобок ({}). Использование инструкции goto для перехода в текст блока __try или в блок обработчика исключений запрещено. Это правило применяется как к обработчикам исключений, так и к обработчикам завершения.
Блок __try содержит защищенный текст кода, который защищает обработчик исключений. Функция может содержать любое количество обработчиков исключений, и эти инструкции обработки исключений могут быть вложены в одну функцию или в разные функции. Если исключение возникает в блоке __try , система управляет и начинает поиск обработчика исключений. Подробное описание этого поиска см. в разделе "Обработка исключений".
Обработчик исключений получает только исключения, возникающие в одном потоке. Это означает, что если блок __try содержит вызов функции CreateProcess или CreateThread, исключения, возникающие в новом процессе или потоке, не отправляются в этот обработчик.
Система вычисляет выражение фильтра каждого обработчика исключений, охраняющего код, в котором произошло исключение, пока не будет обработано исключение или нет дополнительных обработчиков. Выражение фильтра должно быть оценено как одно из трех следующих значений.
Значение | Значение |
---|---|
EXCEPTION_EXECUTE_HANDLER | Система передает управление обработчику исключений, а выполнение продолжается в кадре стека, в котором найден обработчик. |
EXCEPTION_CONTINUE_SEARCH | Система продолжает искать обработчик. |
EXCEPTION_CONTINUE_EXECUTION | Система останавливает поиск обработчика и возвращает элемент управления в точку, в которой произошло исключение. Если исключение не является неконтинуируемым, это приведет к EXCEPTION_NONCONTINUABLE_EXCEPTION исключению. |
Выражение фильтра вычисляется в контексте функции, в которой находится обработчик исключений, несмотря на то, что исключение, возможно, произошло в другой функции. Это означает, что выражение фильтра может получить доступ к локальным переменным функции. Аналогичным образом блок обработчика исключений может получить доступ к локальным переменным функции, в которой она находится.
Дополнительные примеры см. в разделе "Использование обработчика исключений".
Дополнительные сведения о выражениях фильтров и функциях фильтрации см. в разделе "Обработка исключений на основе кадра".