2011-02-19 8 views
1

В Visual C++ 2008, я хочу, чтобы «поймать» исключение генерируется, как показано здесь:Как я могу поймать недействительный вызов fgetpos как исключение C++ в Windows?

try { 
    int foo = 20; 
    ::fgetpos(0, (fpos_t*)&foo); 
} 
//... 

Здесь находятся корректировки, которые я сделал, чтобы попытаться успешный улов:

  1. SEH активируется (/ eha)
  2. Я добавил улов (...)
  3. Я добавил вектор _set_se_translator.
  4. Я добавил/отрегулировать синтаксису 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

+0

Do стараются не держать исключение типа секрета. Посмотрите в окне «Вывод». –

+1

Какое исключение?Обратите внимание, что вызов ':: TerminateProcess()' не является исключением, хотя оба они вызывают остановку вашей программы. –

+0

@Ben: Я не знал, что :: TerminateProcess может вызываться подпрограммами CRT без попытки поиска фильтра исключений. –

ответ

3

Поскольку код в вашей свалке соответствует STATUS_INVALID_CRUNTIME_PARAMETER, попробуйте _set_invalid_parameter_handler

+0

Эй !!! Как вы просмотрели этот код ошибки? «Поиск ошибок» в визуальной студии не помог мне. –

+0

@Brent: с помощью Google –

+0

Кажется, что этот обработчик позволяет мне делать записи, но не позволяет мне восстановиться после сбоя. :( –

2

Скорее всего, время выполнения ловит его для вас и выдает диалоговое окно отладки, не возвращая или не распространяя исключение - это CRT-вызов, и они могут добавлять любой код исключения, который им нравится. Это хорошо в пределах прав Visual Studio, чтобы поймать аппаратное исключение внутри библиотечной функции, особенно, если вы работаете из среды IDE или в режиме отладки, то это ожидается времени выполнения.

Конечно, когда вы делите на ноль, то здесь нет вызова библиотеки, чтобы написать дополнительный код для ловли.

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

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