[英]Ensuring that Exceptions are always caught
C++ 中的异常不需要被调用函数捕获(没有编译时错误)。 因此,是否使用 try/catch 捕获它们取决于开发人员的判断(与 Java 中不同)。
有没有一种方法可以确保抛出的异常总是被调用函数使用 try/catch 捕获?
不。
有关原因,请参阅A Pragmatic Look at Exception Specifications 。
您可以“帮助”这个的唯一方法是记录您的函数可以抛出的异常,比如在声明它的头文件中的注释。 这不是由编译器或任何东西强制执行的。 为此目的使用代码审查。
你不应该在这里使用异常。 如果您需要在使用此功能的任何地方都期待它,这显然不是一个特例!
更好的解决方案是让函数返回这样的实例。 在调试版本中(假设开发人员执行他们刚刚编写的代码路径),如果他们忘记检查操作是否成功,他们将得到一个断言。
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_; }
}
在你的问题范围之外,所以我争论不发布这个,但在 Java 中实际上有两种类型的异常,检查和未检查。 基本区别在于,就像在c[++]
,您不必捕获未经检查的异常。
作为一个很好的参考试试这个
Chris ' 可能对这个问题有最好的纯粹回答:
但是,我对问题的根源很好奇。 如果用户应该始终将调用包装在 try/catch 块中,那么用户调用的函数是否真的应该首先抛出异常?
如果没有更多关于相关代码库的上下文,这是一个很难回答的问题。 从臀部拍摄,我认为这里的最佳答案是将函数包装起来,以便推荐的(如果不仅如此,取决于代码的整体异常样式)公共接口为用户执行 try/catch。 如果您只是想确保代码中没有未处理的异常,那么单元测试和代码审查可能是最好的解决方案。
有没有一种方法可以确保抛出的异常总是被调用函数使用 try/catch 捕获?
我觉得很有趣,Java 人群 - 包括我自己- 试图避免检查异常。 他们正试图通过使用RuntimeExceptions来解决被迫捕获异常的问题。
曾经有人尝试将动态异常规范添加到函数的签名中,但由于该语言无法确保其准确性,因此后来被贬低。
在 C++11 及以后,我们现在有noexcept 说明符。
同样,如果签名被标记为抛出,仍然不需要调用者处理它。
根据上下文,您可以通过将异常行为编码到类型系统中来确保处理异常行为。
请参阅: std::optional作为库基础知识的一部分。
或者你可以开始抛出关键异常。 当然,访问冲突异常会引起你的用户的注意力。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.