【发布时间】:2021-01-01 18:40:04
【问题描述】:
如果构造函数的资源分配部分,例如RAII 套接字包装器失败,我是否只是抛出异常并完成它?或者我应该怎么去std::fstream seems to do it,你需要在构造对象后检查is_open()?
前者似乎更符合“资源分配即初始化”的名称,但那为什么标准库基本上让你在使用对象之前检查错误代码?
我指的是basic_fstream 参考页面上的示例(改写,添加了注释):
int main() {
std::string filename = "test.bin";
std::fstream s(filename);
if (!s.is_open()) { // should my socket class require the user to do this?
std::cout << "failed to open " << filename << '\n';
} else {
// ... use it
}
}
【问题讨论】:
-
并非所有类型的故障都是平等的。无法打开文件通常是合法且预期的路径,因此您不希望在这种情况下引发异常。
-
这是课程的马,因为它取决于打开套接字失败的严重程度。如果打开套接字的失败被认为是例行事件,不会影响您的应用程序继续运行的能力,那么就像
fstream那样做。否则抛出异常。如果发生故障并且代码忘记检查(例如使用is_open()),则fstream方法会出现问题,然后再假设没有发生错误。抛出异常的问题在于它强制调用者响应失败,即使调用者可以安全地忽略它。