이번 편의 목표: 잘못된 일수 입력을 패닉 대신 Result로 돌려 호출자가 처리하게 합니다.

Result는 Ok(값)과 Err(이유) 두 갈래입니다. 입력 실수처럼 호출자가 복구할 수 있는 실패에 씁니다. ?는 Err이면 그 함수에서 즉시 돌려주고, Ok이면 안의 값만 꺼냅니다. 프로그램의 가정 자체가 깨진 버그에만 panic을 둡니다.

Rust
fn parse_days(text: &str) -> Result<i32, String> {
    let days: i32 = text
        .parse()
        .map_err(|_| String::from("숫자가 아닙니다"))?;
    if days < 0 {
        return Err(String::from("음수는 일수가 아닙니다"));
    }
    Ok(days)
}

fn main() {
    match parse_days("3") {
        Ok(days) => println!("{}", days * 100),
        Err(message) => println!("{message}"),
    }
}

3은 정수로 바뀌고 0 이상이므로 Ok(3)입니다. 출력은 300입니다. parse의 오류 타입은 Result의 String과 다릅니다. map_err이 그 오류를 이 함수의 문구로 바꿉니다. ?가 그 다음을 담당합니다.

a는 숫자가 아닙니다. 라는 갈래로 가고, -1은 음수는 일수가 아닙니다. 로 갑니다. 호출자가 match로 금액을 계산할지 문구를 보여줄지 고릅니다.

직접 해 보기

parse_days("-1")로 바꿔 음수는 일수가 아닙니다. 가 출력되는지 확인하세요.

해설

-1은 정수 변환에는 성공합니다. 그 다음 조건이 음수를 Err로 돌리므로, main은 금액 대신 오류 문구를 출력합니다.