Фильтр SetUnhandledException - PullRequest
       5

Фильтр SetUnhandledException

0 голосов
/ 07 октября 2009

Я использую Visual Studio 2005.
Я использую SetUnhandledExceptionFilter для вызова моей пользовательской функции фильтра исключений, когда произойдет непредвиденная ошибка. Моя пользовательская функция фильтра вызывается только в том случае, если непредвиденной ошибкой является Ошибка операционной системы, такая как нарушение прав доступа.

Когда исключением является исключение C ++, которое вызывается с помощью throw, мой пользовательский фильтр исключений не вызывается, но иногда вызывается. Почему это?

Спасибо

Ответы [ 4 ]

2 голосов
/ 07 октября 2009

SetUnhandledExceptionFilter () вызывается, когда выдается структурированное исключение , и отсутствует обработчик для перехвата исключения. Структурированные исключения не такие же, как исключения C ++. Вот почему SetUnhandledExceptionFilter () не вызывается: вы генерируете исключение C ++, а не структурированное исключение.

Структурированные исключения - это независимый от языка механизм обработки исключений, предоставляемый самой Windows. Хорошее место, чтобы прочитать о них здесь . Вы сгенерировали структурированное исключение, используя функцию API RaiseException () , и перехватили их (в C / C ++) с помощью ключевых слов __try и __except.

2 голосов
/ 07 октября 2009

Вы перепутали две разные вещи:

  • Структурированные исключения Windows
  • C ++ исключения

Для структурированных исключений вы можете указать функцию-обработчик с помощью SetUnhandledExceptionFilter. Аналогичная концепция существует для исключений C ++. Здесь вы используете функцию set_unexpected или set_terminate. Ваш обработчик завершения должен завершить приложение, тогда как неожиданный обработчик также может выдать (другой) тип исключения. Таким образом, вы можете перехватывать «иностранные» исключения во всем мире и отображать их на тип исключения по вашему выбору.

0 голосов
/ 02 декабря 2010

См. http://www.debuginfo.com/articles/debugfilters.html о некоторых методах, предотвращающих перезапись вашего фильтра необработанных исключений.

0 голосов
/ 07 октября 2009

Потому что когда вы что-то бросаете и что-то перехватываете, «SetUnhandledExceptionFilter» не будет использоваться. Поэтому я предполагаю, что некоторые исключения, которые вы выбрасываете, отлавливаются либо вами, либо какой-то библиотекой (или чем-то еще), которую вы используете.

int main(){
    try {
        //exception 1 thrown
    } catch (...){
       // exception 1 handling
    }

    // exception 2 thrown
}
// no catch for exception 2, use UnhandledExceptionFilter
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...