确保例外始终是正确的

C ++中的异常不需要被调用函数捕获(没有编译时错误)。所以这取决于开发者是否使用try / catch来捕获它们(与Java不同)。

有没有一种方法可以确保引发的异常总是通过调用函数的try / catch来捕获?

0
关于Java的procrustean处理异常规范的共识是它被严重破坏。
额外 作者 Pete Becker,

7 答案

没有。

有关原因,请参见异常查看规范

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

0
额外

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

请参阅试试这个

0
额外

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

0
额外
如果你读过这段时间,你可能已经注意到我明确提到了一个。
额外 作者 Ryan Fox,
什么,祈祷,是一个“关键”的例外?
额外 作者 John Dibling,

你不应该在这里使用例外。这显然不是一个例外情况,如果你需要在你使用这个功能的时候期待它!

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

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_; }
}
0
额外
GCC至少有一个函数属性需要处理返回值。比这个额外的布尔杂乱。
额外 作者 Zan Lynx,
@JohnDibling让我看看谁不会说出口的严肃的人。
额外 作者 James Kanze,
这个类缺少一个拷贝构造函数和一个赋值操作符。复制构造函数非常重要,因为值是通过复制(可能会被忽略)返回的。在C ++ 11中,你可能需要一个移动构造函数,而不是一个拷贝构造函数,因为你想在被复制的对象中重置 successChecked
额外 作者 James Kanze,
告诉我一个不是庸医或黑客的例子,说例外情况只适用于特殊情况。
额外 作者 John Dibling,
+1。如果您期望得到某些结果,则不应以异常形式返回。
额外 作者 macbirdie,
@JohnDibling我从其他Java开发人员那里听到过很多,但我还没有听到/看到任何书籍,引用或着名开发人员的确切单词。如果是这样,那么Python创建者(s)没有得到备忘录:)
额外 作者 Jason Mock,

曾尝试将动态异常规范添加到函数的签名中,但是自从该语言无法强制执行它们的准确性,它们后来被折旧。

在C ++ 11和forward中,我们现在有 noexcept说明符。 > 同样,如果签名被标记为抛出,那么调用者仍然无法处理它。


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

See: std::optional as part of the library fundamentals.

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

我觉得这很有趣,Java人群 - 包括我自己 - 正试图避免检查异常。他们试图通过使用 RuntimeExceptions

0
额外

Chris' probably has the best pure answer to the question:

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

如果没有更多关于相关代码库的背景知识,这是一个难以回答的问题。从髋关节拍摄,我认为这里最好的答案是包装功能,以便建议(如果不是唯一的,取决于代码的整体异常风格)公共接口执行try / catch 用户。如果您只是想确保代码中没有未处理的异常,则单元测试和代码审查可能是最佳解决方案。

0
额外