Хорошо ли определено следующее в C ++ или нет? Я вынужден «преобразовывать» исключения в коды возврата (рассматриваемый API используется многими пользователями C, поэтому мне нужно убедиться, что все исключения C ++ перехвачены и обработаны до того, как управление будет возвращено вызывающей стороне).
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;
}
Я надеюсь, что образец показывает мое намерение. Я предполагаю, что это неопределенное поведение, но я не уверен. Пожалуйста, предоставьте цитаты из стандарта, если применимо. Также приветствуются альтернативные подходы.
Спасибо!