16.4.1 Early returns

이전 예제에서, 우리는 명시적으로 에러를 처리하기 위해 연결자를 사용했다. 이런 경우를 다루는 또 다른 방법은 match 문과 조기반환(early returns)을 사용하는 것이다.

즉, 우리는 간단하게 함수의 실행을 정지시킬 수 있고 에러가 발생한다면 반환할 수 있다. 가끔은, 이런 형태의 코드는 읽기와 쓰기 앙 측면에서 더 쉬울 수 있다. 이전 예제를 염두하며 조기 반환을 사용하여 재작성 해보자:

// `String`을 에러 타입으로 사용
type Result<T> = std::result::Result<T, String>;

fn double_first(vec: Vec<&str>) -> Result<i32> {
   // 값이 있으면 `Option`을 `Result`로 변환한다.
   // 아닌 경우, 이 `String`을 포함하는 `Err`를 제공
    let first = match vec.first() {
        Some(first) => first,
        None => return Err("Please use a vector with at least one element.".to_owned())
    };

    // `parse`가 제대로 동작했으면 내부 숫자를 두배로 늘린다.
    // 아닌 경우, `parse`가 가져오는 모든 에러를 `String`으로 매핑한다.
    match first.parse::<i32>() {
        Ok(i) => Ok(2 * i),
        Err(e) => Err(e.to_string()),
    }
}

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

fn main() {
    let empty = vec![];
    let strings = vec!["tofu", "93", "18"];

    print(double_first(empty));
    print(double_first(strings));
}

이 시점에서, 우리가 배운 것은 연결자와 조기 반환을 사용한 명시적으로 에러 처리이다. 우리는 일반적으로 panic되버리는 것을 피하길 원하지만, 명시적으로 모든 에러를 처리하는 것은 번거롭고 힘들다.

다음 섹션에서, 우리가 소개할 try!panic의 발생 가능성 없이 간단하게 unwrap하기 위한 경우를 위해 존재한다.

results matching ""

    No results matching ""