我想在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