确保总是捕获异常
时间:2020-03-05 18:37:30 来源:igfitidea点击:
调用函数不需要捕获C ++中的异常(没有编译时错误)。因此,由开发人员决定是否使用try / catch捕获它们(与Java不同)。
有没有一种方法可以确保调用函数始终使用try / catch捕获抛出的异常?
解决方案
回答
不。
为何不查看异常规范的实用说明。
我们可以"帮助"此方法的唯一方法是记录函数可能引发的异常,例如在声明它的头文件中作为注释。这不是由编译器或者其他任何东西强制执行的。为此,请使用代码审查。
回答
或者,我们可以开始引发严重异常。当然,访问冲突异常将引起用户的注意。
回答
在问题范围之外,因此我争辩不发布此内容,但在Java中实际上有两种类型的异常,已检查和未检查。基本区别在于,就像在c [++]
中一样,我们不必捕获未经检查的异常。
为了获得良好的参考,请尝试此
回答
Is there a way one can ensure that the exceptions thrown are always caught using try/catch by the calling function?
我觉得很有趣,包括我在内的Java人群都在努力避免检查异常。他们正在尝试使用RuntimeExceptions来强制捕获异常。
回答
克里斯(Chris)可能对这个问题有最好的答案:
但是,我很好奇这个问题的根源。如果用户始终将调用包装在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_; } }