Visual C ++ SEH — корреляция между перечислением EXCEPTION_DISPOSITION и выражениями фильтра __except ()

Я сейчас читаю о Структурированная обработка исключений (SEH) механизм и делать некоторые упражнения в C ++.

Одна из вещей, которую я не понимаю, —

В excpt.h В файле есть два важных определения «групп»:

  1. Определение EXCEPTION_DISPOSITION enum и определение _except_handler функция обратного вызова
  2. Определение трех макросов — EXCEPTION_EXECUTE_HANDLER (значение равно 1), EXCEPTION_CONTINUE_SEARCH (значение равно 0), EXCEPTION_CONTINUE_EXECUTION (значение — 1)

Насколько я понимаю —

  • Значения EXCEPTION_DISPOSITION используются при просмотре связанного списка обработчиков функций обратного вызова исключений (используя _EXCEPTION_REGISTRATION stuct, на который указывает Блок информации о потоках / среды, на который указывает FS регистр).

  • Значения трех макросов используются как _except фильтры

Некоторые из названий EXCEPTION_DISPOSITION Перечисления имеют те же имена, что и три макроса, упомянутых выше, но имеют совершенно разные обязанности (некоторые используются как _except фильтры и другие используются для перебора связанного списка _EXCEPTION_REGISTRATION).

По сути, мой вопрос —
В чем причина этой корреляции?
Есть ли какое-то «пересечение» между ними? (они как-то «работают» вместе?)

Я что-то здесь упускаю?

1

Решение

Поддержка исключений в библиотеке времени выполнения MSVC ++ основана на поддержке исключений (SEH) в ОС. Так что, конечно, существует сильная корреляция. ОС хочет, чтобы -1, 0 или 1 решали, что делать дальше, значения макросов дублируются из SDK.

В противном случае это прямое совпадение с перечислением, которое возвращается сгенерированными компилятором фильтрами исключений, сгенерированными из ключевых слов try / catch C ++. Библиотека времени выполнения интерпретирует это значение и создает значение SEH. Что именно «вложенное исключение» и «столкнувшееся раскручивание» может означать, ну, в общем, темное Не весь исходный код доступен. Вы должны рассматривать это как чистую деталь реализации, это никак не влияет на ваш собственный код.

Вы всегда используете значения SEH только в своих собственных __except ().

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]