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도 반환 할 수없는 생성자이기 때문입니다.
누군가가 나에게 이러한 오류를 처리하는 방법에 대한 힌트를 줄 수 있기를 바랍니다.
는점멸
또한 소멸자는 throw하지 않아야합니다. – GManNickG
"스택을 푸는 동안 소멸자가 throw하면 어떻게됩니까?" -'std :: terminate()'가 호출됩니다. 따라서 소멸자로부터 던지는 것은'abort()'를 호출하는 것만큼이나 나쁩니다. –
@SteveJessop : 감사합니다. –