16.4.2 Introducing try!

종종 우리는 그저 unwrappanic 가능성 없이 사용하길 원한다. 지금까지는 unwrap을 사용하는 것이 강제되어 내부 깊고 더 깊은 곳에서 우리가 원하는 변수를 꺼내야 했다. 이게 정확히 try!의 목적이다.

Err를 발견하면, 유효한 조치는 두 개가 있다.

  1. panic! 은 우리가 가능하면 피하고자 하는 것.
  2. returnErr가 처리 가능 불가능 할 때.

try!Err시에 panic대신 반환을 하는 unwrap거의1 정확히 동일하다. 이전에 연결자를 사용한 에제를 어떻게 단순화 할 수 있는지 살펴보자.

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

fn double_first(vec: Vec<&str>) -> Result<i32> {
    let first = try!(vec.first()
        .ok_or("Please use a vector with at least one element.".to_owned()));

    let value = try!(first.parse::<i32>()
        .map_err(|e| e.to_string()));

    Ok(2 * value)
}

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));
}

주목할 점은 지금까지 우리가 String를 에러로 사용했다는 것이다. 하지만, 이들을 에러 타입으로 사용하기에는 한계가 있다. 다음 섹션에서 우리가 배울 것은 어떻게 더 구조화되고 유용한 정보를 주는 에러를 그들의 타입을 정의하여 만들 수 있는가이다.

1. See re-enter try! for more details.

See also:

Result and io::Result

results matching ""

    No results matching ""