32

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

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

4

7 回答 7

26

不。

请参阅A Pragmatic Look at Exception Specifications了解为什么不这样做。

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

于 2008-08-04T10:10:15.727 回答
10

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

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

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_; }
}
于 2008-09-24T09:24:01.213 回答
4

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

一个很好的参考试试这个

于 2008-08-04T17:51:33.627 回答
2

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

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

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

于 2008-08-05T04:56:30.210 回答
1

曾经有人尝试将动态异常规范添加到函数的签名中,但由于该语言无法强制它们的准确性,它们后来被贬值了。

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


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

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

于 2016-05-08T15:07:06.227 回答
0

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

我觉得这很有趣,Java 人群——包括我自己——试图避免检查异常。他们正试图通过使用RuntimeExceptions来解决被迫捕获异常的问题。

于 2008-08-04T18:14:20.493 回答
-1

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

于 2008-08-04T17:33:57.890 回答