Il seguente è ben definito in C++ o no? Sono obbligato a "convertire" le eccezioni in codici restituiti (l'API in questione è utilizzata da molti utenti C, quindi devo assicurarmi che tutte le eccezioni C++ vengano intercettate prima che il controllo venga restituito al chiamante) &.È lanciando un'eccezione legale in un "tentativo" annidato?
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;
}
Spero che il campione mostri la mia intenzione. La mia ipotesi è che questo è un comportamento indefinito, ma non ne sono sicuro. Si prega di fornire preventivi dallo standard, se applicabile. Approcci alternativi sono apprezzati pure.
Grazie!
Ricordo di aver preso in considerazione questo approccio per ridurre la duplicazione del codice derivante da diversi blocchi try/catch, ma l'ho implementato. Cosa ti fa pensare che potrebbe essere illegale? –
L'ho già utilizzato in passato è un'ottima tecnica – iain
@jdv - Mi sentivo un po 'a disagio nel rilanciare da dentro un blocco try nidificato in una catch-clause (e anche in un frame stack diverso). Sembrava un po 'troppo bello, quindi volevo essere al sicuro. –