Имейте приложение C++, VS2012, которое выглядит примерно так:
int main(int argc, char* argv[]){
try{
//Stuff
}
catch(exception& e){
std::cout << e.what() << std::endl;
}
int b;
cin >> b;
return 0;
}
Если я перейду к Debug-> Исключениям, то галочка для исключений C++ не будет отмечена галочкой, а поле с пользовательским интерфейсом будет отмечено для исключений C++? Поэтому я ожидаю, что моя команда catch будет выполнена.
Я не понимаю, почему моя инструкция catch не выполняется......
(Также не получается, почему код работает в режиме выпуска, но не работает в режиме F5+ ctrl)
Механизм исключения C++ не должен ловить "сбои" в вашей программе. "Сбой" в коде, скомпилированном Visual Studio, генерирует так называемые структурированные исключения, обрабатываемые механизмом __try - __except - __finally
. Они полностью независимы от C++ исключений. Как правило, они не будут пойманы обработчиками исключений C++ (то есть путем catch
).
Если вы хотите перехватить структурированные исключения с помощью механизма обработки исключений C++ try - catch
, вам необходимо скомпилировать ваш код в режиме /EHa
(что может привести к заметным издержкам производительности). Внутри IDE это контролируется с помощью настройки проекта C/C++ → Code Generation → Enable C++ exceptions
. Однако структурированные исключения не будут совместимы с типом std::exception
, поэтому ваш catch(exception& e)
все равно не перехватит их. Вам придется поймать их с catch (...)
а затем выяснить, что произошло, используя альтернативные способы.
Еще лучше, если вам действительно нужно это сделать, и вы хотите написать свой код в терминах std::exception
, вы можете вручную перевести структурированные исключения в исключения C++, установив функцию транслятора через _set_se_translator.
//Stuff
? Возможно, вы полагаетесь на исключение, сгенерированное проверкой границ итератора, или что-то, чего нет в сборке релиза.