sustitucion - ¿Lanzar dentro de una elipsis de captura(...) vuelve a arrojar el error original en C++?
elipsis recurso cohesivo (1)
Si en mi código tengo el siguiente fragmento de código:
try {
doSomething();
} catch (...) {
doSomethingElse();
throw;
}
¿El lanzamiento volverá a generar la excepción específica capturada por el controlador de puntos suspensivos predeterminado?
Sí. La excepción está activa hasta que se captura, donde queda inactiva. Pero vive hasta que el alcance del controlador termina . De la norma, énfasis mío:
§15.1 / 4: La memoria para la copia temporal de la excepción que se está lanzando se asigna de una manera no especificada, excepto como se indica en 3.7.4.1. El temporizador persiste siempre que se ejecute un controlador para esa excepción.
Es decir:
catch(...)
{ // <--
/* ... */
} // <--
Entre esas flechas, puedes volver a lanzar la excepción. Solo cuando el alcance del controlador termina, la excepción deja de existir.
De hecho, en §15.1 / 6 el ejemplo dado es casi el mismo que su código:
try {
// ...
}
catch (...) { // catch all exceptions
// respond (partially) to exception <-- ! :D
throw; //pass the exception to some
// other handler
}
Tenga en cuenta que si throw
sin una excepción activa, se llamará a la terminate
. Este no puede ser el caso para ti, estar en un controlador.
Si doSomethingElse()
lanza y la excepción no tiene un controlador correspondiente, porque la excepción original se considera manejada, la nueva excepción la reemplazará. (Como si se acabara de tirar, comienza el desenrollado de la pila, etc.)
Es decir:
void doSomethingElse(void)
{
try
{
throw "this is fine";
}
catch(...)
{
// the previous exception dies, back to
// using the original exception
}
try
{
// rethrow the exception that was
// active when doSomethingElse was called
throw;
}
catch (...)
{
throw; // and let it go again
}
throw "this replaces the old exception";
// this new one takes over, begins stack unwinding
// leaves the catch''s scope, old exception is done living,
// and now back to normal exception stuff
}
try
{
throw "original exception";
}
catch (...)
{
doSomethingElse();
throw; // this won''t actually be reached,
// the new exception has begun propagating
}
Claro que si nada tira, throw;
será alcanzado y usted lanzará su excepción atrapada como se esperaba.