Rust 에서 조기 반환을 사용한 오류 처리

Beginner

This tutorial is from open-source community. Access the source code

소개

이 랩에서는 Rust 에서 오류를 처리하는 방법으로 조기 반환 (early returns) 의 개념을 탐구합니다. 예제 코드는 match 문과 조기 반환을 사용하여 오류를 우아하게 처리하는 방법을 보여주며, 코드를 더 읽기 쉽고 쓰기 쉽게 만듭니다. 또한 명시적 오류 처리의 한계에 대해 논의하고, 패닉 (panic) 의 위험 없이 값을 언랩 (unwrap) 해야 하는 경우를 위해 ? 연산자의 사용을 소개합니다.

참고: 랩에서 파일 이름을 지정하지 않은 경우, 원하는 파일 이름을 사용할 수 있습니다. 예를 들어, main.rs를 사용하고 rustc main.rs && ./main으로 컴파일하고 실행할 수 있습니다.

조기 반환 (Early returns)

이전 예제에서는 컴비네이터 (combinators) 를 사용하여 오류를 명시적으로 처리했습니다. 이 경우 분석을 처리하는 또 다른 방법은 match 문과 조기 반환을 함께 사용하는 것입니다.

즉, 오류가 발생하면 함수 실행을 중단하고 오류를 반환할 수 있습니다. 어떤 사람들에게는 이 형태의 코드가 읽고 쓰기 더 쉬울 수 있습니다. 조기 반환을 사용하여 다시 작성된 이전 예제를 살펴보겠습니다.

use std::num::ParseIntError;

fn multiply(first_number_str: &str, second_number_str: &str) -> Result<i32, ParseIntError> {
    let first_number = match first_number_str.parse::<i32>() {
        Ok(first_number)  => first_number,
        Err(e) => return Err(e),
    };

    let second_number = match second_number_str.parse::<i32>() {
        Ok(second_number)  => second_number,
        Err(e) => return Err(e),
    };

    Ok(first_number * second_number)
}

fn print(result: Result<i32, ParseIntError>) {
    match result {
        Ok(n)  => println!("n is {}", n),
        Err(e) => println!("Error: {}", e),
    }
}

fn main() {
    print(multiply("10", "2"));
    print(multiply("t", "2"));
}

이 시점에서 우리는 컴비네이터와 조기 반환을 사용하여 오류를 명시적으로 처리하는 방법을 배웠습니다. 일반적으로 패닉 (panicking) 을 피하고 싶지만, 모든 오류를 명시적으로 처리하는 것은 번거롭습니다.

다음 섹션에서는 panic을 유발할 가능성 없이 단순히 unwrap해야 하는 경우를 위해 ?를 소개합니다.

요약

축하합니다! 조기 반환 (Early Returns) 랩을 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 실력을 향상시킬 수 있습니다.