Что я должен знать о структурированных исключениях (SEH) в C ++?

StackOverflow https://stackoverflow.com/questions/2782915

Вопрос

Какие важные моменты о структурированных исключениях должен знать каждый разработчик 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 ++. История получает свертывающую.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top