C ++ try-catch异常处理约定

时间:2013-06-21 17:41:33

标签: c++ boost exception-handling try-catch

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

感谢您的时间和利益。 --T

2 个答案:

答案 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。但是,也可以从捕获 返回