C++中是否定義好了?我被迫'異常'轉換爲返回代碼(許多C用戶使用該API,因此我需要確保在控制返回給調用者之前處理所有C++異常都被捕獲&)。在嵌套的'try'中重新拋出合法的異常嗎?
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;
}
我希望樣本能顯示我的意圖。我的猜測是這是未定義的行爲,但我不確定。如果適用,請提供標準報價。備選方法也受到讚賞。
謝謝!
我記得考慮採用這種方法來減少來自不同try/catch塊的代碼重複,但我實現了它。是什麼讓你認爲這可能是非法的? – 2010-03-17 21:50:55
我也曾使用過這個技巧 – iain 2010-03-17 22:26:25
@jdv - 我感覺有點不舒服,從嵌套在catch-clause(甚至在不同的堆棧框架)中的try塊中重新拋出。它看起來有點太漂亮了,所以我想保持安全。 – 2010-03-17 22:34:02