我有一个类X,它有一个writeBinary(ostream)方法,可以抛出一个自定义异常 如果流发生了什么事。
写入fstream和错误检查的正确方法是什么?
这是我的版本:我想知道我是否遗漏了一些东西或者我需要抓住 错误。
ofstream ofs("X.binary.tmp");
if (!ofs) {
cerr << "Could not open file for writing";
throw runtime_error("Could not open file for writing");
}
try {
x.writeBinary(ofs);
} catch(CustomException& e) {
// remove the temporary file
int x = unlink("X.binary.tmp");
if (x) {
cerr << "Failed to remove file";
}
throw;
}
if (!ofs) { // is this check necessary?
int x = unlink("X.binary.tmp"):
if (x) {
cerr << "Failed to remove file";
}
throw std::runtime_error("Stream error");
}
rename("X.binary.tmp", "X.binary");
这个大杂烩的例外可以简化吗?
答案 0 :(得分:0)
使事情变得更简洁的一种方法是创建一个资源处理对象 - 所以一个“tempfile”对象,它通过给予构造函数的名称打开一个新文件,并在析构函数中调用unlink,如果文件名是不要空白然后让它具有重命名功能,重命名文件并将名称设置为空白,例如。当然还有一个函数可以从对象中获取ofstream。
我确信这是一样多的代码,但它看起来会更清洁,它会让生活变得更轻松。
编写能够应对大量潜在错误的代码并不容易,您可能已经注意到了......