0

我有一个 Visual Studio 2008 C++ 程序,该程序包含在__try/__except块中以捕获任何 SEH 异常。异常过滤器会创建错误日志并为用户提供有关如何提交缺陷报告的详细说明。

过滤器中的代码是否需要包装在另一个__try/__except块中?如果不是,如果它例外会发生什么?如果有,应该如何处理?

static int MyFilter( struct _EXCEPTION_POINTERS* ep )
{
    /*
    Code to log the exception information, and instruct the user 
    on how to submit a defect report. Should this be in another
    __try/__except block?
    */
    return EXCEPTION_EXECUTE_HANDLER;
}

int WINAPI _tWinMain( HINSTANCE hInstance, 
                      HINSTANCE /*hPrevInstance*/, 
                      LPTSTR lpstrCmdLine, 
                      int nCmdShow )
{
    int result = 0;

    __try
    {
        result = Execute( hInstance, lpstrCmdLine, nCmdShow );
    }
    __except( MyFilter( GetExceptionInformation() ) )
    {
        // empty
    }

    return 0;
}

谢谢,保罗


编辑: 如果MyFilter引发异常,那么我将进入无限异常循环。所以,看起来它确实需要__try/__except处理。我正在考虑这样做:

static int MyFilter( struct _EXCEPTION_POINTERS* ep )
{
    __try 
    {
        /*
        Code to log the exception information, and instruct the user 
        on how to submit a defect report. 
        */

       // cause an exception
       int x = 0, y = 1 / x;
    }
    __except( EXCEPTION_EXECUTE_HANDLER ) { /*empty*/ }
    return EXCEPTION_EXECUTE_HANDLER;
}

在这种情况下,程序应该有一个异常终止,并且应该将异常传递给操作系统来处理。那是对的吗?

4

2 回答 2

0

执行此操作时,您需要注意很多事情。当您的 SEH 处理程序运行时,您的进程处于完全未知的状态,并且您试图指示用户执行的某些操作可能会失败。例如,如果异常是堆栈溢出,那么您在这里几乎无能为力。如果您在这里使用 UI 框架(例如 MFC),它可能会损坏或处于不一致的状态,因为您的应用程序可能在某些重要操作的中途崩溃。如果您的应用程序是多线程的,您需要知道当您进入此过滤器时,那些其他线程仍将运行,并且可能需要小心处理。

如果您确实需要这样做,另一种方法是使用看门狗进程来执行此操作。

于 2011-04-06T17:22:37.290 回答
0

如果您在过滤器中引发异常,您将再次使用过滤器方法。您的异常将由相同的 __except 块处理。
但是在您的过滤器方法中使用另一个 __try __except 块没有问题。
不幸的是,我不能给你任何参考。我自己试过了,你也可以。只需强制除以零。
通常我不使用 SEH,但有几次我在过滤方法中引发异常时没有遇到任何问题。但是当我寻找这个时,我没有在 msdn 中找到任何东西。

于 2011-04-06T16:57:37.503 回答