我想在RAII的帮助下实现一个类。这些资源应该在构造函数中获得,但是可能失败。我将在下面使用文件举个例子:如何在资源获取失败的情况下实现RAII
class file {
public:
file(const char* filename) {
file_ = fopen(filename, "w+");
if(!file_) {
// Okay
}
else {
// ERROR
}
}
~file() {
if (fclose(file_)) {
// ERROR
}
}
void write(const char* str) {
if (EOF == fputs(str, file_)) {
throw runtime_error("file write failure");
}
}
private:
FILE* file_;
};
那么,有什么处理,如果FOPEN返回null,其发生错误的最好方法?因为它是构造函数,所以我也不能返回NULL。
我希望有人能给我一个提示如何处理这样的错误!
谢谢你,最好的问候,
闪光
此外,析构函数应该*不*抛出。 – GManNickG 2011-12-19 18:10:06
“如果堆栈展开期间析构函数抛出会发生什么情况?” - 调用'std :: terminate()'。因此从析构函数中抛出与调用'abort()'差不多。 – 2011-12-19 18:36:14
@SteveJessop:谢谢,答案改进了。 – 2011-12-19 18:37:22