多种错误类型
之前的例子一直都很方便;Result
与其他 Result
交互,而 Option
与其他 Option
交互。
有时,一个 Option
需要与一个 Result
交互,或者一个 Result<T, Error1>
需要与一个 Result<T, Error2>
交互。在这些情况下,我们希望以一种使其可组合且易于交互的方式来管理我们的不同错误类型。
在以下代码中,unwrap
的两个实例生成不同的错误类型。 Vec::first
返回一个 Option
,而 parse::<i32>
返回一个 Result<i32, ParseIntError>
fn double_first(vec: Vec<&str>) -> i32 { let first = vec.first().unwrap(); // Generate error 1 2 * first.parse::<i32>().unwrap() // Generate error 2 } fn main() { let numbers = vec!["42", "93", "18"]; let empty = vec![]; let strings = vec!["tofu", "93", "18"]; println!("The first doubled is {}", double_first(numbers)); println!("The first doubled is {}", double_first(empty)); // Error 1: the input vector is empty println!("The first doubled is {}", double_first(strings)); // Error 2: the element doesn't parse to a number }
在接下来的章节中,我们将看到几种处理此类问题的策略。