Как я могу отловить недопустимый вызов fgetpos как исключение C ++ в Windows? - PullRequest
1 голос
/ 20 февраля 2011

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

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 кажется неуловимой и как ее обойти?

update При выполнении в VS IDE окно вывода не называет исключение.Все, что он говорит, это:

Библиотека времени выполнения Microsoft Visual Studio C обнаружила фатальную ошибку в MyProgram.exe.

Не очень полезно.Когда я запускаю консольное приложение из командной строки, я получаю диалог сбоя.Раздел «Сведения о проблеме» диалогового окна содержит эту информацию:

Имя события проблемы: BEX
Смещение исключения: 0002fd30
Код исключения: c0000417
Данные исключения: 00000000
Дополнительная информация 1: 69ad
Дополнительная информация 2: 69addfb19767b2221c8e3e7a5cd2f4ae
Дополнительная информация 3: b1ff
Дополнительная информация 4: b1ffca30cadddc78c19f19b6d150997f

Ответы [ 2 ]

3 голосов
/ 20 февраля 2011

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

2 голосов
/ 20 февраля 2011

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

Конечно, когда вы делите на ноль, то здесь нет вызова библиотеки, чтобы написать этот дополнительный перехватывающий код.

...