2016-11-15 16 views
1

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

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

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

  1. Определение EXCEPTION_DISPOSITION перечисление и определение _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).

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

Я что-то упустил?

ответ

3

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

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

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

+0

Прежде всего, спасибо за ответ. Во-вторых, я не уверен, что полностью понимаю, что вы сказали в отношении перечисления. Вы сказали, что он возвращается фильтрами, создаваемыми компилятором, и что единственный раз, когда мне нужно его использовать, - это когда я реализую свой собственный __except(). Было бы здорово, если бы вы могли это объяснить. Я знаю, что EXCEPTION_DISPOSITION используется как возвращаемое значение реализации _except_handler (функция обратного вызова исключения). Спасибо. – golosovsky

+0

Я сказал * точный * противоположный: «Вам нужно рассматривать его как деталь чистой реализации, он вообще не влияет на ваш собственный код». Странно, что вы этого не поняли, я не могу догадаться, почему. Повторюсь: используйте только значения макросов в своем собственном коде '__try/__ except', но не перечисляете. –