2016-02-05 4 views
0

Я использую VS2015, и я хочу выкинуть errno из недопустимого обработчика параметров, чтобы я мог форматировать сообщение об ошибке в блоке catch. Мой код выглядит следующим образом:Throw исключение из недопустимого обработчика параметров

_set_invalid_parameter_handler([](wchar_t const*, wchar_t const*, wchar_t const*, unsigned int, uintptr_t) { 
    throw errno; 
}); 
try 
{ 
    char buffer[2]; 
    strcpy_s(buffer, "testtest"); 
} 
catch (int e) 
{ 
    //strerror 
    perror("catch int"); 
} 
catch (...) 
{ 
    perror("catch ..."); 
} 

Если я компиляция в режиме debug, код работает отлично время в release режиме он разбился. Почему это ведет себя по-другому?

+0

@hans Вы правы. И/Ehs также работает, хотя я не знаю точной разницы между ним и/Ehsc – Nifury

ответ

1

Вы должны изменить параметр компиляции, оптимизатор слишком сильно удаляет фильтры исключений в сборке Release, поэтому ваша программа бомбит через terminate() прямо сейчас.

Убедитесь, что выбрана конфигурация Release, Project> Properties> C/C++> Generator Code> Enable C++ Exception. Измените его по умолчанию/Ehsc на/Ehs.

Квалификатор «c» - это укус, он позволяет оптимизатору предположить, что функция extern "C" никогда не может вызывать исключение C++. strcpy_s() является функцией C. Использование/Eha также исправляет это, что заставляет оптимизатор вообще ничего не принимать. Но делает catch (...) слишком опасным, теперь он также поймает действительно неприятный материал SEH, такой как AV.

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