멤버 우선 생성
베이스 클래스, 멤버, 생성자 본문 순서로 진행되므로 검증할 위치를 나눠야 한다.
생성자와 소멸자는 객체 수명의 문이다. 이 구간이 안전해야 예외가 나도 리소스가 새지 않고, 함수 본문은 이미 유효한 객체만 다루게 된다.
베이스 클래스, 멤버, 생성자 본문 순서로 진행되므로 검증할 위치를 나눠야 한다.
생성자가 예외를 던지면 생성 완료 전 멤버만 정리된다. raw handle은 멤버 타입으로 감싸 둔다.
소멸자는 예외를 밖으로 내보내지 않고 자원 반환을 완료해야 안전하다.
로그 실패와 close 실패 정책은 별도 함수로 분리한다.class LogFile {
public:
explicit LogFile(std::filesystem::path path) : out_(path) {
if (!out_) throw std::runtime_error("open failed");
}
private:
std::ofstream out_;
};