SetUnhandledException过滤器

时间:2009-10-07 10:43:42

标签: visual-studio debugging

我使用的是Visual Studio 2005 当发生一些意外错误时,我正在使用SetUnhandledExceptionFilter来调用我的自定义异常过滤器函数。仅当意外错误是“操作系统错误”(如“访问冲突”)时,才会调用我的自定义筛选器函数。

当异常是C ++异常时,使用throw引发,我的自定义异常过滤器不会被调用,但有时仍会被调用。 这是为什么?

谢谢

4 个答案:

答案 0 :(得分:2)

当抛出结构化异常并且没有捕获异常的处理程序时,将调用SetUnhandledExceptionFilter()。结构化异常与C ++异常相同。这就是为什么没有调用SetUnhandledExceptionFilter():你抛出了C ++异常,而不是结构化异常。

结构化异常是Windows自身提供的与语言无关的异常处理机制。阅读它们的好地方是here。您使用RaiseException() API函数抛出了结构化异常,并使用__try和__except关键字捕获它们(在C / C ++中)。

答案 1 :(得分:2)

你混淆了两件不同的东西:

  • Windows结构化例外
  • C ++例外

对于结构化异常,您可以使用SetUnhandledExceptionFilter指定处理函数。 C ++异常存在类似的概念。在这里,您可以使用函数set_unexpectedset_terminate。 您的终止处理程序应该终止应用程序,而意外的处理程序也可以抛出(另一种)异常类型。因此,您可以全局捕获“外部”异常,并将它们映射到您选择的异常类型。

答案 2 :(得分:0)

有关阻止某人覆盖未处理的异常过滤器的一些技巧,请参阅http://www.debuginfo.com/articles/debugfilters.html

答案 3 :(得分:-1)

因为当你扔东西并被某些东西抓住时,将不会使用“SetUnhandledExceptionFilter”。所以我猜你抛出的一些例外是由你或你使用的某些库(或其他东西)捕获的。

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

    // exception 2 thrown
}
// no catch for exception 2, use UnhandledExceptionFilter