Ist das Folgende in C++ klar definiert oder nicht? Ich bin gezwungen, Ausnahmen in Rückgabecodes zu konvertieren (die betreffende API wird von vielen C-Benutzern verwendet, daher muss ich sicherstellen, dass alle C++ - Ausnahmen abgefangen werden, bevor die Kontrolle an den Aufrufer zurückgegeben wird).Wird eine Ausnahme in einem verschachtelten "Versuch" erneut ausgelöst?
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;
}
Ich hoffe, die Probe zeigt meine Absicht. Meine Vermutung ist, dass dies ein undefiniertes Verhalten ist, aber ich bin mir nicht sicher. Bitte geben Sie ggf. Zitate aus dem Standard an. Alternative Ansätze werden ebenfalls geschätzt.
Danke!
Ich erinnere mich daran, diesen Ansatz zu betrachten, um Code-Duplizierung zu reduzieren, die von verschiedenen try/catch-Blöcken herrührt, aber ich implementierte es. Was lässt Sie glauben, dass es illegal sein könnte? –
Ich habe das auch schon benutzt, es ist eine großartige Technik – iain
@jdv - Ich fühlte mich ein wenig unbehaglich, wenn ich innerhalb eines try Blocks, der in einer catch-Klausel (und sogar in einem anderen Stack-Frame) verschachtelt war, erneut austrug. Es sah einfach ein bisschen zu schön aus, also wollte ich auf der sicheren Seite sein. –