2015-04-19 6 views
4

Я рассматриваю аппаратные и программные исключения в visual studio 2013. Я знаю, что могу уловить аппаратные исключения, установив опцию «Включить исключения C++» в/EHa (Да с SEH Исключения). Я пытаюсь поймать следующие исключения:C++ блок try-catch не улавливает аппаратное исключение

EXCEPTION_ARRAY_BOUNDS_EXCEEDED - не расслышал

EXCEPTION_ACCESS_VIOLATION - пойманы

EXCEPTION_INT_OVERFLOW - не расслышал

EXCEPTION_INT_DIVIDE_BY_ZERO - поймал

Это пример кода.

try { 
    a = std::numeric_limits<int>::max(); 
    a += 5; 
} 
catch (...){ 

    std::cout << "EXCEPTION_INT_OVERFLOW Exception Caught" << std::endl; 
    exit(1); 
} 

try { 
    int h = 0; 
    b = b/h; 
} 
catch (...){ 

    std::cout << "EXCEPTION_INT_DIVIDE_BY_ZERO Exception Caught" << std::endl; 
    exit(1); 
} 

Он ловит только разделение на нулевое исключение. Является ли это зависимым от процессора, или есть что-то еще? Еще один маленький вопрос, есть ли разница между сборками debug и release?

+0

Согласно [это] (http://stackoverflow.com/questions/4754826/vs2008-enable-c-exception-with-seh), вам необходимо использовать '__try __except'. См. Https://msdn.microsoft.com/en-us/library/ms681409%28v=vs.85%29.aspx –

+1

@RobertHarvey: Нет, '/ EHa' заставляет обработку исключений C++ использовать операции структурированного исключения и исключения ОС будут пойманы 'catch (...)' –

ответ

2

Это зависит от процессора

ЮП. ОС только отображает аппаратные ловушки для структурированных исключений, она не добавляет логику для обнаружения условий, которых нет у аппаратного обеспечения. (С другой стороны, управляемые структуры, такие как JVM или CLR, часто добавляют логику. Конечно, улов в программном обеспечении несет штраф за производительность, тогда как аппаратная логика ловушки свободна, если на самом деле не происходит ловушка.)

Теперь это не означает, что вы не можете получить EXCEPTION_INT_OVERFLOW на процессорах x86. Но условия не то, что вы ожидаете, - простое обертывание во время добавления не вызывает ловушки. См запись в блоге Реймонда Чена:

 Смежные вопросы

  • Нет связанных вопросов^_^