실패를 타입으로 분류한다
파일 포맷 오류와 범위 오류를 모두 runtime_error 문자열로만 구분하면 호출자가 정책을 만들기 어렵다.
throw는 단순히 빠져나가는 문장이 아니라 호출자에게 어떤 실패가 일어났는지 전달하는 인터페이스다. 타입과 메시지, 상태 보장이 함께 있어야 한다.
파일 포맷 오류와 범위 오류를 모두 runtime_error 문자열로만 구분하면 호출자가 정책을 만들기 어렵다.
멤버 상태를 바꾸기 전에 입력을 검증하거나 임시 객체에 결과를 만든 뒤 교체한다.
파일명, 줄 번호, 키 이름 같은 진단 정보를 메시지나 예외 타입에 포함한다.
if (line.empty()) {
throw ParseError{path, lineNumber, "empty record"};
}