Result 선택
Result 처리는 실패 책임을 현재 함수와 호출자 중 어디 둘지 고르는 일이다
실패를 복구할 수 있으면 현재 함수에서 분기하고, 더 높은 맥락이
필요하면 호출자에게 넘긴다.
unwrap과
expect는 실패가 버그이거나 학습 예제일 때만 좁게 쓴다.
복구 가능다른 파일, 기본값, 재시도로 이어갈 수 있는가.
실패가 버그불변식이 깨졌을 때 바로 멈추는 편이 나은가.
호출자 맥락상위 함수가 사용자 메시지와 정책을 더 잘 아는가.
| 방식 | 쓰는 상황 | 코드 감각 | 주의점 |
|---|---|---|---|
| match | 성공과 실패 모두에서 현재 함수가 할 일이 있다. |
Ok(value)와 Err(error)를 명시적으로
나눈다.
|
분기가 길어지면 실패 처리 의도가 묻힐 수 있다. |
| unwrap | 예제, 임시 코드, 절대 실패하지 않는 불변식 확인에 한정한다. | 실패 시 panic으로 즉시 중단된다. | 운영 코드에서는 원인 설명이 부족하다. |
| expect | 실패가 버그이고, 멈출 때 이유를 남기고 싶다. |
expect("설명")으로 실패 맥락을 붙인다.
|
사용자 입력 실패 같은 정상 흐름에는 맞지 않는다. |
| 물음표 | 현재 함수가 복구하지 않고 호출자에게 실패를 넘긴다. |
File::open(path)?처럼 성공 값만 이어 쓴다.
|
반환 타입이 호환되는 Result여야 한다.
|
| 맥락 추가 | 오류 종류보다 어느 작업에서 실패했는지가 중요하다. | 파일명, 단계명, 사용자 행동을 함께 전달한다. | 원본 오류를 잃지 않게 감싸는 편이 낫다. |
Recover here대체 경로가 있으면 현재 위치에서 처리한다.
Prove invariant실패가 코드 버그라면 명확히 멈춘다.
Add message멈출 때는 사람이 이해할 설명을 남긴다.
Propagate정책 판단은 호출자에게 넘긴다.