¿Está lo siguiente bien definido en C++ o no? Me veo forzado a 'convertir' excepciones en códigos de retorno (la API en cuestión es utilizada por muchos usuarios de C, así que necesito asegurarme de que todas las excepciones de C++ sean interceptadas & antes de que se devuelva el control al llamador).¿Está volviendo a lanzar una excepción legal en un intento anidado?
enum ErrorCode {…};
ErrorCode dispatcher() {
try {
throw;
}
catch (std::bad_alloc&) {
return ErrorCode_OutOfMemory;
}
catch (std::logic_error&) {
return ErrorCode_LogicError;
}
catch (myownstdexcderivedclass&) {
return ErrorCode_42;
}
catch(...) {
return ErrorCode_UnknownWeWillAllDie;
}
}
ErrorCode apifunc() {
try {
// foo() might throw anything
foo();
}
catch(...) {
// dispatcher rethrows the exception and does fine-grained handling
return dispatcher();
}
return ErrorCode_Fine;
}
ErrorCode apifunc2() {
try {
// bar() might throw anything
bar();
}
catch(...) {
return dispatcher();
}
return ErrorCode_Fine;
}
Espero que la muestra muestre mi intención. Creo que esto es un comportamiento indefinido, pero no estoy seguro. Proporcione citas de la norma, si corresponde. También se aprecian enfoques alternativos.
Gracias!
Recuerdo que consideré este enfoque para reducir la duplicación de código que surge de diferentes bloques try/catch, pero lo implementé. ¿Qué te hace pensar que podría ser ilegal? –
Lo he usado antes también es una gran técnica – iain
@jdv - Me sentí un poco incómodo con el replanteo desde dentro de un bloque try anidado en una cláusula catch (e incluso en un marco de pila diferente). Simplemente se veía demasiado hermoso, así que quería estar seguro. –