我有一个小问题,我无法以干净的方式解决。 我正在尝试多态异常处理,所以我在我的异常类中添加了一个raise虚函数来执行实际抛出,我用raise()调用替换了throw。 一切都按预期工作,但后来我将此解决方案应用于具有以下一般形式的返回类型的函数:
Obj Foo()
{
if(true)
return Obj
else
{
//throw Exception; //With this call everything is fine
Exception e{};
e.raise(); //The compiler warns me that I do not return anything
}
}
当我编译这样一个函数时,GCC编译器(v4.9)抱怨Foo到达结尾而没有返回(-Wreturn-type) 有没有办法说服编译器一切正常,而不隐藏警告?
答案 0 :(得分:2)
我假设Exception.raise()
抛出异常并且您正在使用true
来表示某个表达式,该表达式确定是否不抛出异常(而不是C ++关键字)。 (因为你没有提到编译器抱怨一个总是正确的条件)。
显而易见的解决方案是在抛出异常后添加一个return语句。
Exception e{};
e.raise();
return Obj; // this will not be reached
另一个选择是重构您的代码,因此始终存在返回路径
if (!true)
{
Exception e{};
e.raise(); // or, alternatively, throw e
}
return Obj;
这样,对于编译器可以检测的每个执行路径,都有一个有效的return语句。
答案 1 :(得分:1)
为避免这种情况,您可以使函数中的每个控制路径返回与返回类型一致的内容,即使某些条件可以显示为始终有效,或者某些路径可以显示为始终抛出异常。在这里,您的else
路径没有Obj
- 类型返回值。
因此,在e.raise()
之后,您可以返回一些值。如果无法创建合适的值,请考虑让函数返回optional
<obj>
。
答案 2 :(得分:1)
如果你不需要可移植性,并且使用gcc的编译器扩展很好,那么你可以使用gcc noreturn
function attribute,它适用于C和C ++函数:
class Exception {
// ...
void raise() __attribute__ ((noreturn));
};