Неуловимые исключения? - PullRequest
0 голосов
/ 19 февраля 2011

Во-первых, существует ли такая вещь, как неуловимое исключение в C ++?

Я видел одну статью 2005 года по Microsoft kb , в которой обсуждаются исключения, сгенерированные в одной DLL, которые не могутбыть пойманным в другой DLL.Кажется, это было решено с помощью исправления, несколько лет назад, но у меня может быть эта проблема сейчас - с Visual C ++ 2008.

В частности, на основе отчета файла мини-дамп после сбоя, во время вызова ::fgetpos Я вижу это:

kernel32!UnhandledExceptionFilter+0x55b

В моей голове всплывают две вещи.Сначала я замечаю, что указанный блок catch, расположенный в отдельной DLL от вызывающей DLL, не захватил исключение !!!Это повторение того, что описывает эта статья в КБ?Во-вторых, мне интересно, является ли «необработанное исключение» в kernel32 неспособным к перехвату блоком захвата Visual C ++.Я подумал, что было бы достаточно использовать «всеохватывающие» эллипсы.

Есть ли что-то, чего мне не хватает?

Ответы [ 2 ]

10 голосов
/ 19 февраля 2011

Визуальный блок перехвата C ++ будет способен перехватывать только исключение C ++.kernel32!UnhandlesExceptionFilter относится ко всему диапазону исключений SEH, который охватывает гораздо больше, чем просто исключения C ++.Для краткого введения, эта статья все еще свежа и точна: Ускоренный курс по глубине структурированной обработки исключений Win32 ™ .

В то время как мы находимся в этом, вы также должны покрыть/EHa и, возможно, _set_se_translator.И, конечно же, неясные __try/__exception SEH C ++ MSVC-расширения.

4 голосов
/ 19 февраля 2011

Вы должны различать исключения C ++ и SEH.Ядро ничего не знает об исключениях C ++, а C ++ catch () ничего не знает (если не включена расширенная обработка catch) о SEH.Исключения SEH отслеживаются с помощью блоков _try и _finally.Они очень разные, и никогда не следует смешивать их.

...