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

有没有一种方法可以确保调用函数始终使用 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_; }
}

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

供良好参考 尝试这个

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

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

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

是否有一种方法可以确保始终使用呼叫功能的try/catch捕获抛出的异常?

我觉得这很有趣,Java 人群 - 包括我自己 - 试图避免检查异常。他们正在尝试通过使用以下方法来解决被迫捕获异常的问题 运行时异常.

曾经尝试添加 动态异常规范 到函数的签名,但由于语言无法保证其准确性,因此它们后来被贬值。

在 C++11 及更高版本中,我们现在有 无例外说明符.
同样,如果签名被标记为抛出,则仍然不需要调用者处理它。


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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top