确保始终捕获异常

时间:2008-08-04 10:01:38

标签: c++ exception try-catch

调用函数不需要捕获C ++中的异常(没有编译时错误)。所以这取决于开发人员是否使用try / catch来捕获它们(与Java不同)。

有没有办法确保抛出的异常总是被调用函数使用try / catch捕获?

7 个答案:

答案 0 :(得分:23)

没有

请参阅A Pragmatic Look at Exception Specifications了解原因。

你可以“帮助”这个的唯一方法是记录你的函数可以抛出的异常,比如在头文件中声明它的注释。这不是由编译器或任何东西强制执行的。为此目的使用代码审查。

答案 1 :(得分:9)

你不应该在这里使用例外。如果您需要在使用此功能的任何地方期待它,这显然不是特例!

更好的解决方案是让函数返回这样的实例。在调试版本中(假设开发人员使用他们刚编写的代码路径),如果他们忘记检查操作是否成功,他们将获得一个断言。

class SearchResult
{
  private:
    ResultType result_;
    bool succeeded_;
    bool succeessChecked_;

  public:
    SearchResult(Result& result, bool succeeded)
      : result_(result)
      , succeeded_(succeeded)
      , successChecked_(false)
    {
    }

    ~SearchResult()
    {
      ASSERT(successChecked_);
    }

    ResultType& Result() { return result_; }
    bool Succeeded() { successChecked_ = true; return succeeded_; }
}

答案 2 :(得分:3)

在你的问题范围之外所以我辩论不发布这个但是在Java中实际上有两种类型的例外,检查和取消选中。基本的区别在于,就像在c[++]中一样,您不必捕获未经检查的异常。

有一个很好的参考try this

答案 3 :(得分:2)

Chris'可能对这个问题有最好的纯粹答案:

然而,我对这个问题的根源感到好奇。如果用户总是将调用包装在try / catch块中,那么用户调用的函数是否真的会抛出异常?

如果没有关于相关代码库的更多背景信息,这是一个难以回答的问题。从臀部拍摄,我认为这里最好的答案是将函数包装起来,以便推荐(如果不仅仅是,取决于代码的整体异常样式)公共接口执行try / catch for 用户。如果您只是想确保代码中没有未处理的异常,则单元测试和代码审查可能是最佳解决方案。

答案 4 :(得分:0)

  

有没有办法可以确保   抛出的异常总是被捕获   通过调用使用try / catch   功能

我觉得很有趣,Java群体 - including myself - 试图避免检查异常。他们试图通过使用RuntimeExceptions来强制捕获异常。

答案 5 :(得分:0)

曾尝试将dynamic exception specifications添加到函数的签名中,但由于该语言无法强制执行其准确性,因此稍后会对其进行折旧。

在C ++ 11中,我们现在拥有noexcept specifier 同样,如果签名被标记为抛出,则仍然不需要调用者处理它。

根据上下文,您可以通过将其编码到类型系统中来确保处理异常行为。

请参阅: std::optional,作为图书馆基础知识的一部分。

答案 6 :(得分:-1)

或者你可以开始抛出关键异常。当然,访问冲突异常将捕获用户的注意力。