Я сейчас читаю о механизме Структурированный механизм исключения (SEH) и выполняет некоторые упражнения на C++.C++ SEH - корреляция между выражениями EXCEPTION_DISPOSITION и выражениями __except()
Одна из вещей, которые я не понимаю, -
В excpt.h
файле есть два важных понятия «группы»:
- Определение
EXCEPTION_DISPOSITION
перечисление и определение_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
).
В принципе, мой вопрос: В чем причина этой корреляции? Есть ли какое-то «пересечение» между ними? (они «работают» вместе каким-то образом?)
Я что-то упустил?
Прежде всего, спасибо за ответ. Во-вторых, я не уверен, что полностью понимаю, что вы сказали в отношении перечисления. Вы сказали, что он возвращается фильтрами, создаваемыми компилятором, и что единственный раз, когда мне нужно его использовать, - это когда я реализую свой собственный __except(). Было бы здорово, если бы вы могли это объяснить. Я знаю, что EXCEPTION_DISPOSITION используется как возвращаемое значение реализации _except_handler (функция обратного вызова исключения). Спасибо. – golosovsky
Я сказал * точный * противоположный: «Вам нужно рассматривать его как деталь чистой реализации, он вообще не влияет на ваш собственный код». Странно, что вы этого не поняли, я не могу догадаться, почему. Повторюсь: используйте только значения макросов в своем собственном коде '__try/__ except', но не перечисляете. –