2009-10-07 150 views
0

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

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

谢谢

回答

-1

因为当你扔东西,它是由什么逮住,“SetUnhandledExceptionFilter”将不被使用。所以我想你抛出的一些例外是由你或者你使用的某个库(或者某个东西)来捕捉的。当结构化异常被抛出并没有处理程序捕获异常

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

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

C++异常与结构化异常不同。 – 2009-10-07 11:29:33

+0

是的,但我没有捕捉到我的代码中的C++异常。如果我不抓住C++异常,我应该调用未处理的异常过滤器,对吗? – user152508 2009-10-07 11:39:50

+1

否。未处理的C++异常导致调用terminate函数,如下所述:http://msdn.microsoft.com/en-us/library/ac9f67ah%28VS.80%29.aspx。没有发生结构化的异常(除非你自己调用RaiseException()来明确地提出终止函数中的一个) – 2009-10-07 12:38:42

2

SetUnhandledExceptionFilter()被调用。结构化异常是而不是与C++异常相同。这就是为什么SetUnhandledExceptionFilter()没有被调用:你正在抛出一个C++异常,而不是结构化异常。

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

+0

这是否意味着我的过滤器不会被调用,如果我抛出未捕获的C++异常?我知道肯定,如果我发现异常,将不会被调用。 – user152508 2009-10-07 11:41:35

+1

你问:“这是否意味着如果我抛出未被捕获的C++异常,我的过滤器将不会被调用?”。这是对的。 通过抛出C++异常来调用筛选器的唯一方法是,如果抛出(或捕获)C++异常的行为随后会引发结构化异常。 这两个异常处理系统是完全独立的。 – 2009-10-07 12:34:30

2

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

  • 的Windows结构化异常
  • C++异常

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

+0

是的,是不是内部使用SEH实现C++异常?如果是,我应该执行安装了SetUnhandledExceptionFilter的意外过滤器。请注意,有些时候,我的未处理的异常过滤器在C++异常未由catch引发时执行。有时不是。我无法弄清楚有时候的一部分。 – user152508 2009-10-07 11:58:13