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

确保始终捕获异常 C++中的异常不需要被调用函数捕获(没有编译时错误)。所以,是否使用try/catch捕获它们(与Java不同),取决于开发人员的判断,c++,exception,try-catch,C++,Exception,Try Catch,有没有办法确保调用函数总是使用try/catch捕获抛出的异常?否 看看为什么不 “帮助”这一点的唯一方法是记录函数可以抛出的异常,比如在声明它的头文件中作为注释。这不是由编译器或任何东西强制执行的。为此,请使用代码检查。或者您可以开始抛出关键异常。当然,访问冲突异常会引起用户的注意。超出了您的问题范围,因此我讨论了不发布此消息的问题,但在Java中,实际上有两种类型的异常,已检查和未检查。基本的区别在于,就像在c[++]中一样,您不必捕获未检查的异常 供参考 有没有办法确保 抛出的异常总是被捕

有没有办法确保调用函数总是使用try/catch捕获抛出的异常?

看看为什么不


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

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

超出了您的问题范围,因此我讨论了不发布此消息的问题,但在Java中,实际上有两种类型的异常,已检查和未检查。基本的区别在于,就像在
c[++]
中一样,您不必捕获未检查的异常

供参考

有没有办法确保 抛出的异常总是被捕获 通过调用使用try/catch 功能

我觉得很有趣的是,Java人群正试图避免检查异常。他们正试图通过使用来解决被强制捕获异常的问题。

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

然而,我对这个问题的根源感到好奇。如果用户应该总是将调用包装在try/catch块中,那么用户调用的函数是否应该首先抛出异常


这是一个很难回答的问题,如果没有更多关于所讨论的代码库的上下文。直截了当地说,我认为这里最好的答案是将函数包装起来,这样推荐的(如果不仅仅是,取决于代码的总体异常样式)公共界面就可以为用户提供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_; }
}

曾经有人试图添加函数的签名,但由于该语言无法增强其准确性,因此后来被贬低

在C++11及以后版本中,我们现在有了。
同样,如果签名被标记为throw,那么仍然不要求调用方处理它


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


请参见:作为库基础知识的一部分。

+1。如果希望得到某些结果,则不应以异常的形式返回。GCC至少有一个函数属性要求处理返回值。没有这个额外的麻烦。给我一个不是江湖医生或黑客的例子,他说例外只适用于例外情况。@JohnDibling我从其他Java开发人员那里听到过很多,但我还没有从任何书籍、参考资料或著名开发人员那里听到/看到这些确切的词。如果是这样的话,那么Python创建者就没有收到备忘录:)@JohnDibling告诉我谁是认真的,谁没有说出来。praytell,什么是“关键”异常?如果你读过这段时间,你可能已经注意到我明确提到了一个异常。关于Java的Procruste异常规范方法的共识是,它被严重破坏了。