3

这可能是一个微不足道的问题 - 但对我来说并不明显,所以我需要一些确认。假设我在函数中有一个 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;
}

IIRC,我需要将return a语句放在每个catch块中,对吗?同样在每个catch块中,a都会有 value 10,对吧?

感谢您的时间和兴趣。--T

4

2 回答 2

4

IIRC,我需要将return a语句放在每个catch块中,对吗?

不,在这种情况下不是。重要的是,您不要在不返回任何内容的情况下从返回值函数的末尾流出(到 6.6.3/2,这将是未定义的行为)。

因为你有一个 return 声明:

return a;

在你的函数结束时,你的catch块不需要包含一个。

此外,如果在发生错误时没有任何值要返回,则可以通过执行以下操作重新抛出当前处理的异常:

throw;

或者完全避免捕获并重新抛出该异常并通过省略相应的块来让它传播catch,以防您对如何恢复和/或您不需要记录任何消息没有足够的知识。

让异常向上传播调用堆栈可能比仅仅返回一个硬编码值(例如 10)更有意义。

至于第二个问题:

同样在每个 catch 块中, a 的值为 10,对吗?

是的,这是有保证的。

于 2013-06-21T17:45:20.430 回答
2

由于你有return a函数结束,你可以return acatch中省略。但是,从捕获中返回也可以。

于 2013-06-21T17:45:29.313 回答