c++ -确保始终捕获异常

Translate

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

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

This question and all comments follow the "Attribution Required."

所有的回答

Translate

没有。

看到异常规格的务实观察由于某些原因为什么不这样做。

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

来源
Translate

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

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

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_; }
}
来源
Translate

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

供参考尝试这个

来源
Translate

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

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

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

来源
Translate

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

我觉得很有趣,Java人群-包括我自己-试图避免检查异常。他们正努力解决被迫通过使用捕获异常的方法RuntimeExceptions.

来源
Translate

曾经尝试添加动态异常规范到函数签名的位置,但是由于语言无法保证其准确性,因此后来对其进行了折旧。

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


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

看到: std ::可选作为图书馆基础知识的一部分。

来源
Translate

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

来源