Я думаю, что Вы не поняли, или, может быть, я не достаточно ясно написал это: ПЕРВЫЙ я попытался бросить int, ПОСЛЕ того, что с X ... Я мог смешать второй код, когда писал его здесь, простите за это

я есть функция, в которой я звонюgetaddrinfo() чтобы получитьsockaddr* какая целевая память выделяется системой. Как многие могут знать, вам нужно позвонитьfreeaddrinfo() освободить память, выделенную getaddrinfo ().

Теперь в моей функции есть несколько мест, где я могу выдать исключение, потому что какая-то функция не выполнена. Моим первым решением было включитьfreeaddrinfo() в каждый блок if. Но для меня это выглядело уродливо, потому что мне все равно пришлось бы вызывать его до того, как моя функция вернулась, поэтому я пришел к SEH, который попытался окончательно ...

Но проблема, с которой я столкнулся, заключается в том, что не разрешается кодировать операторы throw в блок __try-

Затем я прочитал msdn и попытался поменять операторы throw в вспомогательную функцию, вызываемую из __try-блока ... и вуаля, компилятор больше не стонал ...

Почему это? И это безопасно? Это не имеет смысла для меня: /

Код:

void function()
{
    //...
    addrinfo* pFinal;
    __try
    {
        getaddrinfo(..., &pFinal);

        //if(DoSomething1() == FAILED)
        //  throw(exception);           //error C2712: Cannot use __try in functions that require object unwinding

        //but this works
        Helper();


        //...

    }
    __finally
    {
        freeaddrinfo();
    }
}


void Helper()
{
    throw(Exception);
}

РЕДАКТИРОВАТЬ:

попробовал следующее, и это работает с бросанием целого числа, но не, когда я использую класс в качестве исключения:

class X
{
public:
    X(){};
    ~X(){};
};


void Helper()
{
    throw(X());
}


void base()
{
    __try
        {
            std::cout << "entering __try\n";

            Helper();

            std::cout << "leaving __try\n";
        }
        __finally
        {
            std::cout << "in __finally\n";
        }
};


int _tmain(int argc, _TCHAR* argv[])
{
    try
    {
        base();
    }
    catch(int& X)
    {
        std::cout << "caught a X" << std::endl;
    }

    std::cin.get();
    return 0;
}

Почему? : /

Ответы на вопрос(3)

Ваш ответ на вопрос