Когда Visual Studio 6 ловит структурированные исключения? - PullRequest
2 голосов
/ 27 июля 2010

Это в основном любопытство, но я читал об истории Visual Studio по отлову исключений SEH в конструкции C ++ try-catch. Я продолжаю утверждать, что более старые версии Visual Studio с включенным флагом / GX «иногда» ловили структурированные исключения Win32 в блоке C ++ catch.

При каких обстоятельствах Visual Studio 6.0 вводит блок catch в следующем коде при сборке с флагом / GX?

char * p = NULL;

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

В моих собственных простых тестах с Visual Studio 6 + SP6 выполнение программы останавливается с неисследованным исключением, и «In catch» никогда не печатается. Однако некоторые статьи (например, this one) заставляют меня поверить, что можно войти в блок catch.

1 Ответ

0 голосов
/ 27 июля 2010
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

...