确保总是捕获异常

时间:2020-03-05 18:37:30  来源:igfitidea点击:

调用函数不需要捕获C ++中的异常(没有编译时错误)。因此,由开发人员决定是否使用try / catch捕获它们(与Java不同)。

有没有一种方法可以确保调用函数始终使用try / catch捕获抛出的异常?

解决方案

回答

不。

为何不查看异常规范的实用说明。

我们可以"帮助"此方法的唯一方法是记录函数可能引发的异常,例如在声明它的头文件中作为注释。这不是由编译器或者其他任何东西强制执行的。为此,请使用代码审查。

回答

或者,我们可以开始引发严重异常。当然,访问冲突异常将引起用户的注意。

回答

在问题范围之外,因此我争辩不发布此内容,但在Java中实际上有两种类型的异常,已检查和未检查。基本区别在于,就像在c [++]中一样,我们不必捕获未经检查的异常。

为了获得良好的参考,请尝试此

回答

Is there a way one can ensure that the
  exceptions thrown are always caught
  using try/catch by the calling
  function?

我觉得很有趣,包括我在内的Java人群都在努力避免检查异常。他们正在尝试使用RuntimeExceptions来强制捕获异常。

回答

克里斯(Chris)可能对这个问题有最好的答案:

但是,我很好奇这个问题的根源。如果用户始终将调用包装在try / catch块中,那么用户调用的函数是否真的应该首先抛出异常?

如果没有有关代码库的更多上下文,这是一个很难回答的问题。从臀部射击,我认为最好的答案是包装功能,以使推荐的(如果不是唯一的话,取决于代码的整体异常样式)公共接口为用户进行尝试/捕获。如果我们只是想确保代码中没有未处理的异常,则单元测试和代码审查可能是最好的解决方案。

回答

我们不应该在这里使用异常。如果我们在使用此功能的任何地方都需要期待它,这显然不是例外情况!

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

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_; }
}