Aquí está la configuración.¿Qué sucede si utilizo "throw"? sin una excepción para tirar?
Tengo un programa que llama a varias funciones de C++, todos los cuales potencialmente lanzar el mismo conjunto excepción, y quiero el mismo comportamiento de las excepciones en cada función (mensaje de error, por ejemplo impresión & cancelar todos los datos a los valores predeterminados para exceptionA; simplemente imprime para exceptionB; shut-down cleanly para todas las otras excepciones).
Parece como si tuviera que ser capaz de establecer el comportamiento de captura a llamar a una función privada que simplemente relanzamientos el error, y realiza las capturas, así:
void aFunction()
{
try{ /* do some stuff that might throw */ }
catch(...){handle();}
}
void bFunction()
{
try{ /* do some stuff that might throw */ }
catch(...){handle();}
}
void handle()
{
try{throw;}
catch(anException)
{
// common code for both aFunction and bFunction
// involving the exception they threw
}
catch(anotherException)
{
// common code for both aFunction and bFunction
// involving the exception they threw
}
catch(...)
{
// common code for both aFunction and bFunction
// involving the exception they threw
}
}
Ahora, ¿qué ocurre si "manejar" se llama fuera de la clase de excepción. Soy consciente de que esto nunca debería suceder, pero me pregunto si el comportamiento no está definido por el estándar de C++.
Se termina, pero ¿qué quieres que haga ?, te proporciona un compilador para ejecutar este programa para que puedas verificar el resultado. –
Todo lo que hará un compilador es compilarlo. Y se compilará, porque no hay nada sobre la * definición * de handle para advertir a un usuario que definitivamente requerirá una excepción cargada. Los compiladores no pueden decirle mucho sobre el comportamiento indefinido, especialmente algo como esto que no se recogerá hasta el tiempo de ejecución. – deworde