C.W.K.
Stream
Lesson 06 of 06 · published

Result 살짝 보기

~9 min · enums, result, errors

Level 0Rust 호기심러
0 XP0/80 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete

'값이 있을 수도' 의 enum 인 Option 을 만났어. 그 형제가 '에러가 있을 수도' 의 enum 인 Result 야. 지금 — 그냥 또 하나의 enum 으로 — 만나두면 Error Handling 트랙 전체가 집처럼 느껴져.

Result 는 Option 의 사촌이야

Result<T, E> 는 variant 둘: Ok(T) (성공, 값을 실음) 와 Err(E) (실패, 에러를 실음). Option 이 '있음 또는 없음' 이라면, Result 는 '성공 또는 실패, 그리고 실패 이유는 이거' 야. 그 추가된 E — 이유 — 가 차이 전부야.

처리 방식은 같아

enum 이니까 방금 배운 도구로 Result 를 처리해: OkErrmatch, 또는 if let Ok(v), 또는 unwrap_or 같은 메서드. 실패할 수 있는 건 뭐든 — 숫자 파싱, 파일 읽기, 소켓 열기 — Result 를 반환하고, 컴파일러가 Err 경우를 마주하게 만들어.

에러는 예외가 아니라 값이야. Rust 엔 try/catch 도 던져지는 예외도 없어. 실패할 수 있는 함수는 반환 타입 (Result) 으로 그렇다고 말하고, 실패는 네가 match 하는 평범한 값으로 코드를 흘러. 본 적도 없는 에러를 실수로 무시 못 해 — 타입이 시그니처에 바로 있거든.

다음 트랙으로의 다리

사방에서 Result 를 반환하면 장황해질 수 있어 — match, match, match. Error Handling 트랙이 에러 전파를 한 글자로 만드는 ? 연산자를 소개하고, 네 에러 타입을 정의하는 법도. enum 은 이미 이해했으니; 이제 그걸 ergonomic 하게 휘두르는 법을 배워.

Code

Result: 성공 또는 실패의 이유·rust
fn parse_age(s: &str) -> Result<u32, String> {
    match s.trim().parse::<u32>() {
        Ok(n) => Ok(n),
        Err(_) => Err(format!("not a number: {s}")),
    }
}

fn main() {
    match parse_age("42") {
        Ok(age) => println!("age is {age}"),
        Err(e) => println!("error: {e}"),
    }
    // Result 는 enum 이라 Option 스타일 메서드도 통해:
    let age = parse_age("oops").unwrap_or(0);
    println!("fallback age: {age}");
}

External links

Exercise

0 으로 나눌 때 메시지와 함께 Err 를, 아니면 Ok 를 반환하는 fn divide(a: f64, b: f64) -> Result<f64, String> 를 써봐. 둘 다 match 로 처리해. 그다음 예측해봐: 다음 트랙에서 에러를 그냥 위로 전파하고 싶을 때 그 match 를 뭐가 대체할까?
Hint
? 연산자. Err 를 일찍 반환하고 Ok 를 unwrap 해서, 세 줄 match 를 한 글자로 바꿔 — Error Handling 트랙의 헤드라인 기능이야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 똘이warm

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.