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


Время обработки исключений. Общие сведения

Обработчик завершения выполняется независимо от того, как завершается блок инструкции __try. Причины включают выход из блока __try, инструкцию longjmp, которая передает контроль за пределы блока, а также освобождение стека из-за обработки исключения.

Примечание

Visual C++ поддерживает две формы инструкций setjmp и longjmp.Быстрая версия обходит обработку завершения, однако является более эффективной.Для использования этой версии включите файл SETJMP.H.Другая версия поддерживает обработку завершения, как описано в предыдущем абзаце.Для использования этой версии включите файл SETJMPEX.H.Увеличение производительности быстрой версии зависит от конфигурации оборудования.

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

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

  1. Выдается исключение.

  2. Система анализирует иерархию активных обработчиков исключений и выполняет фильтр обработчика с наивысшим приоритетом; это обработчик исключений, который был установлен последним и имеет наиболее глубокую структуру с точки зрения блоков и вызовов функций.

  3. Если этот фильтр передает контроль (возвращает 0), процесс продолжается до тех пор, пока не будет найден фильтр, который не передает контроль.

  4. Если этот фильтр возвращает значение –1, выполнение продолжается там, где было вызвано исключение. Завершение не происходит.

  5. Если фильтр возвращает 1, возникают следующие события:

    • Система освобождает стек, снимает все кадры стека между текущим исполняемым кодом (где было создано исключение) и кадром стека, который содержит получающий контроль обработчик исключений.

    • По мере освобождения стека выполняется каждый обработчик завершения в стеке.

    • Выполняется сам обработчик исключений.

    • Контроль переходит к строке кода после окончания этого обработчика исключений.

См. также

Ссылки

Написание обработчика завершения

Структурированная обработка исключений (C/C++)