多态异常处理和编译器警告

时间:2016-02-05 11:57:59

标签: c++ exception-handling compiler-warnings

我有一个小问题,我无法以干净的方式解决。 我正在尝试多态异常处理,所以我在我的异常类中添加了一个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) 有没有办法说服编译器一切正常,而不隐藏警告?

3 个答案:

答案 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));

};