Я думаю, что Вы не поняли, или, может быть, я не достаточно ясно написал это: ПЕРВЫЙ я попытался бросить 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;
}
Почему? : /