Поделиться через


Обработка исключений на основе кадров

Обработчик исключений на основе кадра позволяет справиться с возможностью возникновения исключения в определенной последовательности кода. Обработчик исключений на основе кадра состоит из следующих элементов.

  • Защищенный текст кода
  • Выражение фильтра
  • Блок обработчика исключений

Обработчики исключений на основе кадров объявляются в синтаксисе для конкретного языка. Например, в компиляторе оптимизации Microsoft C/C++ они реализуются с помощью __try и __except. Дополнительные сведения см. в разделе "Синтаксис обработчика".

Защищенный текст кода представляет собой набор одной или нескольких инструкций, для которых выражение фильтра и блок обработчика исключений обеспечивают защиту обработки исключений. Защищенный текст может быть блоком кода, набором вложенных блоков или всей процедурой или функцией. С помощью компилятора оптимизации Microsoft C/C++ защищенный текст заключен в скобки ({}) после __try ключевое слово.

Выражение фильтра обработчика исключений на основе кадра — это выражение , вычисляемое системой при возникновении исключения в защищенном теле. Эта оценка приводит к одному из следующих действий системы.

  • Система останавливает поиск обработчика исключений, восстанавливает состояние компьютера и продолжает выполнение потока в точке, в которой произошло исключение.
  • Система продолжает поиск обработчика исключений.
  • Система передает управление обработчику исключений, а выполнение потока продолжается последовательно в кадре стека, в котором найден обработчик исключений. Если обработчик не находится в кадре стека, в котором произошло исключение, система отменяет стек, оставляя текущий кадр стека и любые другие кадры стека, пока не вернется к кадру стека обработчика исключений. Перед выполнением обработчика исключений обработчик завершения выполняется для всех защищенных тел кода, завершающихся в результате передачи элемента управления обработчику исключений. Дополнительные сведения об обработчиках завершения см. в разделе "Обработка завершения".

Выражение фильтра может быть простым выражением или вызывать функцию фильтра, которая пытается обработать исключение. Функции GetExceptionCode и GetExceptionInformation можно вызывать из выражения фильтра, чтобы получить сведения об отфильтрованном исключении. GetExceptionCode возвращает код, определяющий тип исключения, и GetExceptionInformation возвращает указатель на структуру EXCEPTION_POINTERS, содержащую указатели на структуры CONTEXT и EXCEPTION_RECORD.

Эти функции нельзя вызывать из функции фильтра, но их возвращаемые значения могут передаваться в качестве параметров в функцию фильтра. GetExceptionCode можно использовать в блоке обработчика исключений, но GetExceptionInformation не может, так как информация, на которую она указывает, обычно находится в стеке и уничтожается при передаче элемента управления обработчику исключений. Однако приложение может скопировать сведения в безопасное хранилище, чтобы сделать его доступным обработчику исключений.

Преимущество функции фильтра заключается в том, что она может обрабатывать исключение и возвращать значение, которое приводит к продолжению выполнения системы с точки, в которой произошло исключение. В блоке обработчика исключений, напротив, выполнение продолжается последовательно из обработчика исключений, а не из точки исключения.

Обработка исключения может быть как простой, так как отмечать ошибку и задавать флаг, который будет рассмотрен позже, печать предупреждения или сообщения об ошибке или принятие других ограниченных действий. Если можно продолжить выполнение, может потребоваться также изменить состояние компьютера, изменив запись контекста. Пример функции фильтра, обрабатывающей исключение сбоя страницы, см. в разделе "Использование функций виртуальной памяти".

Функцию UnhandledExceptionFilter можно использовать в качестве функции фильтра в выражении фильтра. Он возвращает EXCEPTION_EXECUTE_HANDLER, если процесс не отлаживается, в этом случае он возвращает EXCEPTION_CONTINUE_SEARCH.