关于c ++:确保始终捕获异常

关于c ++:确保始终捕获异常

Ensuring that Exceptions are always caught

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

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


没有。

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

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


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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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[++]中一样,您不必捕获未经检查的异常。

作为参考,试试这个


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

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

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


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

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

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

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


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

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


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


推荐阅读