Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Обработчик исключений, основанный на кадре, позволяет справиться с возможностью возникновения исключения в определенной последовательности кода. Обработчик исключений на основе кадра состоит из следующих элементов.
- Защищенный текст кода
- Выражение фильтра
- Блок обработчика исключений
Обработчики исключений на основе кадров объявляются в синтаксисе для конкретного языка. Например, в компиляторе оптимизации Microsoft C/C++ они реализуются с помощью __try и __except. Дополнительные сведения см. в синтаксиса обработчика.
защищенный блок кода представляет собой набор одной или нескольких инструкций, для которых выражение фильтра и блок обработчика исключений обеспечивают обработку исключений. Защищенный текст может быть блоком кода, набором вложенных блоков или всей процедурой или функцией. Используя компилятор оптимизации Microsoft C/C++, защищенный текст заключен в скобки ({}) после ключевого слова __try.
Выражение фильтра обработчика исключений на основе кадра — это выражение, вычисляемое системой при возникновении исключения в защищенном теле. Эта оценка приводит к одному из следующих действий системы.
- Система останавливает поиск обработчика исключений, восстанавливает состояние компьютера и продолжает выполнение потока в точке, в которой произошло исключение.
- Система продолжает поиск обработчика исключений.
- Система передает управление обработчику исключений, а выполнение потока продолжается последовательно в кадре стека, в котором найден обработчик исключений. Если обработчик не находится в кадре стека, в котором произошло исключение, система отменяет стек, оставляя текущий кадр стека и любые другие кадры стека, пока не вернется к кадру стека обработчика исключений. Перед выполнением обработчика исключений обработчики завершения выполняются для всех защищённых блоков кода, которые завершились в результате передачи управления обработчику исключений. Дополнительные сведения об обработчиках завершения см. в разделе Обработчики завершения.
Выражение фильтра может быть простым выражением или вызывать функцию фильтра , которая пытается обработать исключение. Вы можете вызвать функции GetExceptionCode и GetExceptionInformation из выражения фильтра, чтобы получить сведения об отфильтрованном исключении. GetExceptionCode возвращает код, определяющий тип исключения, и GetExceptionInformation возвращает указатель на структуру EXCEPTION_POINTERS, содержащую указатели на КОНТЕКСТ и структуры EXCEPTION_RECORD.
Эти функции нельзя вызывать из функции фильтра, но их возвращаемые значения могут передаваться в качестве параметров в функцию фильтра. GetExceptionCode можно использовать в блоке обработчика исключений, но GetExceptionInformation нельзя, так как сведения, указанные им, обычно находятся в стеке и уничтожаются, когда управление передается обработчику исключений. Однако приложение может скопировать сведения в безопасное хранилище, чтобы сделать его доступным обработчику исключений.
Преимущество функции фильтра заключается в том, что она может обрабатывать исключение и возвращать значение, которое приводит к продолжению выполнения системы с точки, в которой произошло исключение. В блоке обработчика исключений, напротив, выполнение продолжается последовательно из обработчика исключений, а не из точки исключения.
Обработка исключения может быть настолько простой, как отметка ошибки и установка флага для последующего рассмотрения, и печать предупреждения или сообщения об ошибке, или предпринятие других ограниченных действий. Если можно продолжить выполнение, может потребоваться также изменить состояние компьютера, изменив запись контекста. Пример функции фильтра, обрабатывающей исключение сбоя страницы, см. в разделе Использование функций виртуальной памяти.
Функцию UnhandledExceptionFilter можно использовать в качестве функции фильтра в выражении фильтра. Он возвращает EXCEPTION_EXECUTE_HANDLER, если процесс не отлаживается, в этом случае он возвращает EXCEPTION_CONTINUE_SEARCH.