c++ 确保始终捕获异常

fzsnzjdm  于 2023-06-07  发布在  其他
关注(0)|答案(7)|浏览(369)

C++中的异常不需要被调用函数捕获(没有编译时错误)。因此,是否使用try/catch捕获它们取决于开发人员的判断(与Java不同)。
有没有一种方法可以确保抛出的异常总是由调用函数使用try/catch捕获?

3htmauhk

3htmauhk1#

没有
请参阅A Pragmatic Look at Exception Specifications了解为什么不。
唯一能“帮助”这一点的方法是记录你的函数可以抛出的异常,比如在声明它的头文件中写一个注解。这不是由编译器或任何东西强制执行的。使用代码审查来达到这个目的。

mtb9vblg

mtb9vblg2#

你不应该在这里使用异常。这显然不是一个例外的情况下,如果你需要期待它在任何地方你使用这个函数!
一个更好的解决方案是让函数返回这样的示例。在调试构建中(假设开发人员执行他们刚刚编写的代码路径),如果他们忘记检查操作是否成功,他们将得到一个Assert。

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_; }
}
gg58donl

gg58donl3#

超出了你的问题范围,所以我不想发表这篇文章,但在Java中实际上有两种类型的异常,检查和未检查。基本的区别是,与c[++]中非常相似,您不必捕获未检查的异常。
对于一个很好的参考try this

lnvxswe2

lnvxswe24#

克里斯可能对这个问题有最好的纯粹答案:
然而,我对问题的根源很好奇。如果用户应该总是将调用 Package 在try/catch块中,那么用户调用的函数真的应该首先抛出异常吗?
这是一个很难回答的问题,如果没有更多关于所讨论的代码库的上下文。从臀部射击,我认为这里最好的答案是 Package 功能,这样推荐的(如果不是唯一的,取决于代码的整体异常风格)公共接口为用户做try/catch *。如果您只是想确保代码中没有未处理的异常,那么单元测试和代码审查可能是最好的解决方案。

e5nszbig

e5nszbig5#

曾经有一次尝试将dynamic exception specifications添加到函数的签名中,但由于语言无法强制其准确性,因此后来被贬低。
在C++11及以后的版本中,我们现在有了noexcept specifier
同样,如果签名被标记为抛出,则仍然不需要由调用者处理它。
根据上下文的不同,可以通过将异常行为编码到类型系统中来确保处理异常行为。

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

gk7wooem

gk7wooem6#

有没有一种方法可以确保抛出的异常总是由调用函数使用try/catch捕获?
我觉得很有趣,Java人群-including myself-正在试图避免检查异常。他们试图通过使用RuntimeExceptions来解决被迫捕获异常的问题。

slsn1g29

slsn1g297#

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

相关问题