2

这主要是出于好奇,但我一直在阅读有关 Visual Studio 在 C++try-catch构造中捕获 SEH 异常的历史。我一直在断言启用了 /GX 标志的旧版本 Visual Studio 会“有时”在 C++catch块中捕获结构化的 Win32 异常。

什么情况下Visual Studio 6.0 使用/GX 标志构建时会在下面的代码中进入catch 块?

char * p = NULL;

try
{
    *p = 'A';
}
catch(...)
{
    printf("In catch\n");
}

在我自己使用 Visual Studio 6 + SP6 进行的简单测试中,程序执行会因未处理的异常而停止,并且永远不会打印“In catch”。然而,一些文章(比如这篇文章)让我相信进入catch区块是可能的。

4

1 回答 1

0
int main()
{
    __try
    {
        int *pInt = NULL;
        *pInt = 0;// throw some kind of exception
    }
    __except( EXCEPTION_EXECUTE_HANDLER )
    {
        DWORD dw = GetExceptionCode();
        switch(dw)
        {
        case EXCEPTION_ACCESS_VIOLATION:
            cout << "access violation\n";
            break;
        case EXCEPTION_INT_DIVIDE_BY_ZERO:
            cout << "int divide by zero\n";
            break;
        case EXCEPTION_FLT_DIVIDE_BY_ZERO:
            cout << "floating point divide by zero\n";
            break;
        // other cases
        }
    }
    return 0;
}

那也许是我发现的唯一方式 看在网上。

我也猜到了即使您知道为什么处理此类异常并不好,但对于来到这里的谷歌人来说,请阅读:

http://members.cox.net/doug_web/eh.htm#Q1

于 2010-07-27T18:42:35.567 回答