В Visual C++ 2008, я хочу, чтобы «поймать» исключение генерируется, как показано здесь:Как я могу поймать недействительный вызов fgetpos как исключение C++ в Windows?
try {
int foo = 20;
::fgetpos(0, (fpos_t*)&foo);
}
//...
Здесь находятся корректировки, которые я сделал, чтобы попытаться успешный улов:
- SEH активируется (/ eha)
- Я добавил улов (...)
- Я добавил вектор _set_se_translator.
- Я добавил/отрегулировать синтаксису SEH: __try/__except (EXCEPTION_EXECUTE_HANDLER)
Короче говоря, я пытался «все в книге», и я до сих пор не могу поймать исключение. Если я заменил вызов на ::fgetpos
на int hey = foo/0
, тогда внезапно все вышеперечисленные методы будут работать, как ожидалось. Поэтому исключение, с которым я имею дело от ::fgetpos
, как-то «лишний».
Может кто-нибудь объяснить, почему эта ошибка: fgetpos кажется неуловимой и как ее обойти?
обновление При выполнении в VS IDE выходное окно не указывает исключение. Все, что он говорит, это:
Библиотека времени выполнения Visual Studio C Microsoft Visual обнаружила фатальную ошибку в MyProgram.exe.
Не очень полезно. Когда я запускаю консольное приложение из командной строки, я получаю диалог об авариях. В разделе "сведения о проблеме" диалога включает в себя следующую информацию:
Имя события проблемы: BEX
Exception Offset: 0002fd30
Код исключения: c0000417
Исключение данных: 00000000
Дополнительная информация 1: 69ad
Дополнительная информация 2: 69addfb19767b2221c8e3e7a5cd2f4ae
Дополнительная информация 3: b1ff
Дополнительная информация 4: b1ffca30cadddc78c19f19b6d150997f
Do стараются не держать исключение типа секрета. Посмотрите в окне «Вывод». –
Какое исключение?Обратите внимание, что вызов ':: TerminateProcess()' не является исключением, хотя оба они вызывают остановку вашей программы. –
@Ben: Я не знал, что :: TerminateProcess может вызываться подпрограммами CRT без попытки поиска фильтра исключений. –