Что я должен знать о структурированных исключениях (SEH) в C ++?
-
03-10-2019 - |
Вопрос
Какие важные моменты о структурированных исключениях должен знать каждый разработчик C ++?
Решение
Они являются Win32, эквивалентными сигналам UNIX, и позволяют уловить исключения ЦП, такие как нарушение доступа, нелегальное обучение, разделить на ноль.
С помощью правильных вариантов компилятора (/ EHA для Visual C ++) исключения C ++ используют один и тот же механизм, как раскручивание стека, как правильно, как для исключения C ++ (пользователей), так и для исключения SEH (OS).
В отличие от исключения C ++, SEH не напечатаны, но все разделяют одну и ту же структуру данных, которая имеет код исключения (причина) и дополнительную информацию о том, какой код неисправна и какие регистры CPU проводятся во время неисправности. Видеть GetExceptionCode
а также GetExceptionInformation
Для более подробной информации об этом.
Кроме того, SEH имеет «первый шанс» обработки, что позволяет войти или иным образом обращаться с исключением до Разматывание уничтожает все локальные переменные.
Другие советы
Недавно у меня возникла проблема, которая была косвенно вызвана SEH, в частности, из-за одной особенности SEH, о которой, я думаю, должен знать каждый разработчик:
Когда используется SEH, деструкторы не вызываются, поэтому, если у вас есть код очистки в вашем деструкторе, он не будет очищен.
Наша проблема была вызвана Критической секцией, которая была обернута объектом с блокировкой в конструкторе и разблокировкой в деструкторе.
У нас была тупиковая ситуация, и мы не могли понять почему, и примерно через неделю копания в коде, дампах и отладки мы, наконец, поняли, что это произошло из-за исключения, которое было обработано COM и из-за которого критический раздел оставался заблокированным.Мы изменили флаг компиляции в VS в свойствах проекта, который указывает ему запускать деструкторы даже для SEH, и это решило проблему.
Таким образом, даже если вы можете не использовать SEH в своем коде, вы можете использовать библиотеку, которая это делает (например, COM), и это может вызвать неожиданное поведение.
Они должны знать, что они не являются частью стандартных C ++ - это изобретение Microsoft и может использоваться на языках, отличных от C ++.
Колебный курс на глубинах по структурированной обработке исключения Win32 ™
Эта статья то Ссылка на то, чтобы встать на скорость с помощью SEH. 13 лет спустя, все еще лучший, есть.
Есть выделенная тема на MSDN для Обработка исключений Seh vs. C ++.
Некоторые вещи разработчик C ++ должны знать, если Seh обсуждается:
Написание C / C ++ SEH Обработчики исключений:
__try
{
// guarded code
}
__except ( expression )
{
// exception handler code
}
Это нет Обработка исключения C ++ - это утечные расширения MS для подключения прямой inot SEH. Он работает совсем по-разному из ваших исключений C ++. Вам нужно хорошее понимание SEH, чтобы использовать их.
Написание C / C ++ SEH Обработчики расторжения:
__try {
// guarded code
}
__finally ( expression ) {
// termination code
}
Та же, что и с обработчиком SEH, не путайте это с семантикой исключения C ++. Вам нужно хорошее понимание Seh.
_set_se_trasnlator
: Это функция, которая переводит SEH исключения в исключения типа C ++, когда используются асинхронные исключения / Эха.
И, наконец, личное мнение: должен ли разработчик C ++ знать SEH? После вашего первого новичка .ecxr. Вы поймете, что когда Push приходит в Shove C ++ Исключения, - это просто иллюзия, предусмотренная для вашего удобства. Единственное, что происходит, это SEH.
Важным моментом является знание, когда использовать SEH и когда использовать стандартные исключения C ++. Во-первых, выберите только одну систему смешивания системы, как правило, будут проблематичными, требуя глубокого понимания как для реализации хорошо. Во-вторых, на высоком уровне SEH не ограничивается C ++, а стандартные исключения C ++ не ограничены Windows. Если это не определяет ваше решение, выберите стандартные исключения, если они не являются неадекватными (см. Другие ответы для более подробной информации о том, что может сделать SEH).
Цитата из Документация Microsoft (от 08/3/2018 от 08/2018) поддерживает этот вывод.
Структурированная обработка исключения (SEH) - это расширение Microsoft для C для обработки определенных исключительных кодовых ситуаций, таких как оборудование неисправностей, изящно. Хотя Windows и Microsoft C ++ SEH SEH, мы рекомендуем использовать ESO-стандартную обработку исключения C ++, потому что он делает ваш код более портативным и гибким. Тем не менее, для поддержания существующего кода или для определенных видов программ, вам все равно может придеться использовать SEH.
Почему автор расширения рекомендует его не использоваться в большинстве случаев? Предположительно, потому что расширение было написано для C и текущий контекст C ++. Языки аналогичны, поэтому портирование SEH к C ++ в качестве побочной выгоды, вероятно, было достаточно легко, хотя бы только «конкретные виды программ» будут по-настоящему выиграть. (Или, возможно, какая-то другая причина; возможно, портирование было запущено до стандартизации C ++. История получает свертывающую.)