Я сейчас читаю о Структурированная обработка исключений (SEH) механизм и делать некоторые упражнения в C ++.
Одна из вещей, которую я не понимаю, —
В excpt.h
В файле есть два важных определения «групп»:
EXCEPTION_DISPOSITION
enum и определение _except_handler
функция обратного вызова EXCEPTION_EXECUTE_HANDLER
(значение равно 1), EXCEPTION_CONTINUE_SEARCH
(значение равно 0), EXCEPTION_CONTINUE_EXECUTION
(значение — 1)Насколько я понимаю —
Значения EXCEPTION_DISPOSITION
используются при просмотре связанного списка обработчиков функций обратного вызова исключений (используя _EXCEPTION_REGISTRATION
stuct, на который указывает Блок информации о потоках / среды, на который указывает FS
регистр).
Значения трех макросов используются как _except
фильтры
Некоторые из названий EXCEPTION_DISPOSITION
Перечисления имеют те же имена, что и три макроса, упомянутых выше, но имеют совершенно разные обязанности (некоторые используются как _except
фильтры и другие используются для перебора связанного списка _EXCEPTION_REGISTRATION
).
По сути, мой вопрос —
В чем причина этой корреляции?
Есть ли какое-то «пересечение» между ними? (они как-то «работают» вместе?)
Я что-то здесь упускаю?
Поддержка исключений в библиотеке времени выполнения MSVC ++ основана на поддержке исключений (SEH) в ОС. Так что, конечно, существует сильная корреляция. ОС хочет, чтобы -1, 0 или 1 решали, что делать дальше, значения макросов дублируются из SDK.
В противном случае это прямое совпадение с перечислением, которое возвращается сгенерированными компилятором фильтрами исключений, сгенерированными из ключевых слов try / catch C ++. Библиотека времени выполнения интерпретирует это значение и создает значение SEH. Что именно «вложенное исключение» и «столкнувшееся раскручивание» может означать, ну, в общем, темное Не весь исходный код доступен. Вы должны рассматривать это как чистую деталь реализации, это никак не влияет на ваш собственный код.
Вы всегда используете значения SEH только в своих собственных __except ().
Других решений пока нет …