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

Какие важные моменты о Структурированных Исключениях каждый разработчик C++ должен знать?

42
задан Andrew T 6 May 2010 в 17:01
поделиться

3 ответа

Они являются Win32-эквивалентом сигналов Unix, и позволяют вам отлавливать исключения процессора, такие как нарушение доступа, недопустимая инструкция, деление на ноль.

При правильных опциях компилятора (/EHa для Visual C++), исключения C++ используют тот же механизм, что и разворачивание стека, работающий правильно как для исключений C++ (пользовательских), так и для исключений SEH (OS).

В отличие от исключений C++, исключения SEH не типизированы, но все они имеют одну и ту же структуру данных, которая содержит код исключения (причину) и дополнительную информацию о том, какой код сработал и что было в регистрах процессора во время ошибки. См. GetExceptionCode и GetExceptionInformation для более подробной информации об этом.

Также SEH имеет обработку "первого шанса", которая позволяет вам регистрировать или иным образом обрабатывать исключение до того, как размотка уничтожит все локальные переменные.

40
ответ дан 26 November 2019 в 23:24
поделиться

Краткий курс по глубине структурированной обработки исключений Win32 ™

Эта статья - справочник по быстрому освоению SEH. 13 лет спустя все еще остается лучшим.

В MSDN есть специальная тема для SEH и 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 ++ при использовании асинхронных исключений / EHa .

И, наконец, личное мнение: должен ли разработчик на C ++ знать SEH? После вашего первого новичка .ecxr вы поймете, что когда приходит толчок, исключения C ++ - всего лишь иллюзия, созданная для вашего удобства. Единственное, что происходит, - это SEH.

20
ответ дан 26 November 2019 в 23:24
поделиться

Они должны знать, что они не являются частью Стандартного C++ - они являются изобретением Microsoft и могут быть использованы в языках, отличных от C++.

24
ответ дан 26 November 2019 в 23:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: