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
하기 위한 경우를 위해 존재한다.