Почему мой код catch не выполняется?

0

Имейте приложение 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;
}
  • Если я работаю в режиме отладки, работает нормально.
  • Если я запускаю режим Release, он работает нормально.
  • Если я запущусь в F5+ ctrl, приложение завершится с ошибкой И мой оператор catch не будет выполнен.

Если я перейду к Debug-> Исключениям, то галочка для исключений C++ не будет отмечена галочкой, а поле с пользовательским интерфейсом будет отмечено для исключений C++? Поэтому я ожидаю, что моя команда catch будет выполнена.

Я не понимаю, почему моя инструкция catch не выполняется......

(Также не получается, почему код работает в режиме выпуска, но не работает в режиме F5+ ctrl)

  • 0
    Ну ... что именно происходит в //Stuff ? Возможно, вы полагаетесь на исключение, сгенерированное проверкой границ итератора, или что-то, чего нет в сборке релиза.
  • 0
    @paddy что-то делать с хэшем (unordered_map). К сожалению, не могу много рассказать: s
Теги:
visual-studio
exception
visual-studio-2012

1 ответ

2

Механизм исключения 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню