这可能是一个微不足道的问题 - 但这对我来说并不明显,所以我需要一些确认。假设我在函数中有一个try-catch块:
int function some_crap() {
some_type b;
int a = 10;
try {
a = boost::numeric_cast<int>(b);
}
catch(boost::bad_numeric_cast& e) {
std::cout << e.what() << std::endl;
return a;
}
catch(...) {
//-Handle other unknown exceptions
return a;
}
return a;
}
return a
块中放置catch
语句,对吧?同样在每个catch
块中,a
的值为10
,对吧?
感谢您的时间和利益。 --T
答案 0 :(得分:4)
IIRC,我需要在每个 return a
块中放置catch
语句,对吗?
不,不是在这种情况下。重要的是你不会返回值返回函数的末尾而不返回任何东西(6.6.3 / 2,这将是未定义的行为)。
因为你有一个return语句:
return a;
在您的功能结束时,您的catch
块不需要包含一个。
此外,如果您在发生错误时没有任何值可以返回,则可以通过执行以下操作重新抛出当前处理的异常:
throw;
或者避免捕获并重新抛出该异常并通过省略相应的catch
块来传播它,以防您没有足够的知识来恢复和/或不需要记录任何消息。
让异常传播到调用堆栈可能比返回硬编码值(如10)更有意义。
至于第二个问题:
同样在每个catch块中,a的值为10,对吧?
是的,这是有保障的。
答案 1 :(得分:2)
由于您在功能结束时return a
,您可以在 catch 中省略return a
。但是,也可以从捕获 返回。