我不确定为什么Eclipse报告没有返回值。它不应该知道我要么返回一个值还是扔掉,所以不需要警告?
class PropertyCollection : public PersistentObject
{
private:
std::map<const bmd2::string, bmd2::string> container;
public:
bmd2::string & operator[](const bmd2::string & s) throw (CustomException);
};
bmd2::string & operator[](const bmd2::string & s) throw (CustomException)
{
try
{
return container.at(s);
}
catch (std::out_of_range & e) {
throw CustomException();
};
}
答案 0 :(得分:2)
您的代码确实是正确的。在返回之前没有代码路径可以到达函数的末尾(抛出将导致函数返回)。
日食代码分析器根本看不到(它不是分析仪无法理解的唯一有效代码,你会看到)。在我看来,最好的解决方案(除了修复eclipse,这可能是相当多的工作)将简单地从代码分析器首选项中禁用此特定规则。虽然知道你忘记从代码路径返回可能是有用的,但是不值得误报。此外,只要警告被启用,编译器就应该警告你这些。
有点偏离主题,请阅读有关异常说明符的this。
答案 1 :(得分:2)
catch
块之后不需要分号(在语法上不需要):
bmd2::string & operator[](const bmd2::string & s) throw (CustomException)
{
try
{
return container.at(s);
}
catch (std::out_of_range & e) {
throw CustomException();
}; // <--- Semicolon not needed
}
因此,编译器可能会告诉您,null语句不是return语句,因此执行会在不返回值的情况下从函数末尾开始执行。
答案 2 :(得分:0)
如果您不想禁用该规则,那么愚蠢的解决方法(可能会导致警告来自编译器的死代码的警告)正在添加{{ 1}}在函数结束时,在catch ...块结束之后。
它将关闭Eclipse,并且不会损害最终结果,但是在稍后分析代码时要对其进行评论以避免困惑是很好的。
return