C++中的异常不需要被调用函数捕获(没有编译时错误)。因此,是否使用try/catch捕获它们取决于开发人员的判断(与Java不同)。有没有一种方法可以确保抛出的异常总是由调用函数使用try/catch捕获?
3htmauhk1#
没有请参阅A Pragmatic Look at Exception Specifications了解为什么不。唯一能“帮助”这一点的方法是记录你的函数可以抛出的异常,比如在声明它的头文件中写一个注解。这不是由编译器或任何东西强制执行的。使用代码审查来达到这个目的。
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_; } }
gg58donl3#
超出了你的问题范围,所以我不想发表这篇文章,但在Java中实际上有两种类型的异常,检查和未检查。基本的区别是,与c[++]中非常相似,您不必捕获未检查的异常。对于一个很好的参考try this
c[++]
lnvxswe24#
克里斯可能对这个问题有最好的纯粹答案:然而,我对问题的根源很好奇。如果用户应该总是将调用 Package 在try/catch块中,那么用户调用的函数真的应该首先抛出异常吗?这是一个很难回答的问题,如果没有更多关于所讨论的代码库的上下文。从臀部射击,我认为这里最好的答案是 Package 功能,这样推荐的(如果不是唯一的,取决于代码的整体异常风格)公共接口为用户做try/catch *。如果您只是想确保代码中没有未处理的异常,那么单元测试和代码审查可能是最好的解决方案。
e5nszbig5#
曾经有一次尝试将dynamic exception specifications添加到函数的签名中,但由于语言无法强制其准确性,因此后来被贬低。在C++11及以后的版本中,我们现在有了noexcept specifier。同样,如果签名被标记为抛出,则仍然不需要由调用者处理它。根据上下文的不同,可以通过将异常行为编码到类型系统中来确保处理异常行为。
请参阅:std::optional作为库基础的一部分。
gk7wooem6#
有没有一种方法可以确保抛出的异常总是由调用函数使用try/catch捕获?我觉得很有趣,Java人群-including myself-正在试图避免检查异常。他们试图通过使用RuntimeExceptions来解决被迫捕获异常的问题。
slsn1g297#
或者你可以开始抛出关键异常。当然,访问冲突异常会引起用户的注意。
7条答案
按热度按时间3htmauhk1#
没有
请参阅A Pragmatic Look at Exception Specifications了解为什么不。
唯一能“帮助”这一点的方法是记录你的函数可以抛出的异常,比如在声明它的头文件中写一个注解。这不是由编译器或任何东西强制执行的。使用代码审查来达到这个目的。
mtb9vblg2#
你不应该在这里使用异常。这显然不是一个例外的情况下,如果你需要期待它在任何地方你使用这个函数!
一个更好的解决方案是让函数返回这样的示例。在调试构建中(假设开发人员执行他们刚刚编写的代码路径),如果他们忘记检查操作是否成功,他们将得到一个Assert。
gg58donl3#
超出了你的问题范围,所以我不想发表这篇文章,但在Java中实际上有两种类型的异常,检查和未检查。基本的区别是,与
c[++]
中非常相似,您不必捕获未检查的异常。对于一个很好的参考try this
lnvxswe24#
克里斯可能对这个问题有最好的纯粹答案:
然而,我对问题的根源很好奇。如果用户应该总是将调用 Package 在try/catch块中,那么用户调用的函数真的应该首先抛出异常吗?
这是一个很难回答的问题,如果没有更多关于所讨论的代码库的上下文。从臀部射击,我认为这里最好的答案是 Package 功能,这样推荐的(如果不是唯一的,取决于代码的整体异常风格)公共接口为用户做try/catch *。如果您只是想确保代码中没有未处理的异常,那么单元测试和代码审查可能是最好的解决方案。
e5nszbig5#
曾经有一次尝试将dynamic exception specifications添加到函数的签名中,但由于语言无法强制其准确性,因此后来被贬低。
在C++11及以后的版本中,我们现在有了noexcept specifier。
同样,如果签名被标记为抛出,则仍然不需要由调用者处理它。
根据上下文的不同,可以通过将异常行为编码到类型系统中来确保处理异常行为。
请参阅:std::optional作为库基础的一部分。
gk7wooem6#
有没有一种方法可以确保抛出的异常总是由调用函数使用try/catch捕获?
我觉得很有趣,Java人群-including myself-正在试图避免检查异常。他们试图通过使用RuntimeExceptions来解决被迫捕获异常的问题。
slsn1g297#
或者你可以开始抛出关键异常。当然,访问冲突异常会引起用户的注意。