2012-12-28 2 views
1

스트림에 문제가 발생하면 사용자 지정 예외를 throw 할 수있는 writeBinary (ostream) 메서드가있는 클래스 X가 있습니다.예외가있는 C++ 스트림 검사 오류

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

일을 덜 난잡하게 만드는 한 가지 방법은 리소스 처리 개체를 만드는 것입니다. 따라서 "tempfile"개체는 생성자에게 주어진 이름으로 새 파일을 열고 소멸자는 파일 이름 비어 있지 않습니다. 그런 다음 파일의 이름을 바꾸고 이름을 공백으로 설정하는 이름 바꾸기 함수를 가져야합니다. 그리고 물론 객체의 ofstream을 제공하는 함수.

나는 그것이 많은 코드이지만, 훨씬 더 깨끗해 보일 것이며, 훨씬 더 쉽게 삶을 살 수있을 것이라고 확신한다.

많은 잠재적 인 오류에 대처하는 코드를 작성하는 것은 쉬운 일이 아닙니다 ...