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

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

===============>>#1 票数:24 已采纳

没有。

为何不查看例外规范的实用说明。

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

===============>>#2 票数: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_; }
}

===============>>#3 票数:3

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

为了更好的参考, 试试这个

===============>>#4 票数:2

克里斯对于这个问题可能是最好的纯答案:

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

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

===============>>#5 票数:0

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

我觉得很有趣,Java人群( 包括我自己 )正试图避免检查异常。 他们正在尝试通过使用RuntimeExceptions来强制捕获异常。

===============>>#6 票数:0

曾经试图将动态异常规范添加到函数的签名中,但是由于该语言无法提高其准确性,因此后来对其进行了折旧。

在C ++ 11及更高版本中 ,我们现在有了noexcept说明符
同样,如果签名被标记为抛出,则仍然没有要求调用者对其进行处理。


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

请参阅: std :: optional作为库基础知识的一部分。

===============>>#7 票数:-1

或者,您可以开始引发严重异常。 当然,访问冲突异常会引起你的用户的注意力。

  ask by sachin translate from so

未解决问题?本站智能推荐:

关注微信公众号