intermixing manejo de excepciones de c ++ y SEH (windows)
Tengo una función en la que llamogetaddrinfo()
para obtener unsockaddr*
que el sistema asigna la memoria de objetivos. Como muchos sabrán, debe llamar afreeaddrinfo()
para liberar la memoria asignada por getaddrinfo ().
Ahora, en mi función, hay algunos lugares donde puedo lanzar una excepción, porque algunas funciones fallaron. Mi primera solución fue incorporar elfreeaddrinfo()
en cada bloque if. Pero eso me pareció feo, porque habría tenido que llamarlo de todos modos antes de que mi función regrese, así que se me ocurrió el intento de SEH finalmente ...
Pero el problema que encontré es que no está permitido codificar las declaraciones de lanzamiento en el bloque __t
Luego, leí en el msdn e intenté intercambiar las declaraciones de lanzamiento en la función auxiliar llamada desde el bloque __try ... y listo, el compilador ya no gimió ...
¿Porqué es eso? ¿Y esto es seguro? Esto no tiene sentido para mi :
Código
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);
}
EDITAR
intenté lo siguiente y funciona arrojando un número entero, pero no cuando uso una clase como excepción:
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;
}
¿Por qué? : /