16.4.2 Introducing try!
종종 우리는 그저 unwrap
을 panic
가능성 없이 사용하길 원한다. 지금까지는 unwrap
을 사용하는 것이 강제되어 내부 깊고 더 깊은 곳에서 우리가 원하는 변수를 꺼내야 했다. 이게 정확히 try!
의 목적이다.
Err
를 발견하면, 유효한 조치는 두 개가 있다.
panic!
은 우리가 가능하면 피하고자 하는 것.return
은Err
가 처리 가능 불가능 할 때.
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