解包处理

Ticket::new现在在遇到无效输入时返回一个Result而不是恐慌。这对调用者意味着什么?

错误不能(隐式)忽略

与异常不同,Rust的Result迫使你在调用地点显式处理错误。如果你调用一个返回Result的函数,Rust不允许你隐式忽略错误情况。

#![allow(unused)]
fn main() {
fn parse_int(s: &str) -> Result<i32, ParseIntError> {
    // ...
}

// 这将无法编译:我们没有处理错误情况。
// 我们必须使用`match`或`Result`提供的组合子之一来“解包”成功值或处理错误。
let number = parse_int("42") + 2;
}

得到了一个Result,然后呢?

当你调用返回Result的函数时,你有两个主要选择:

  • 如果操作失败,则恐慌。 这通常使用unwrapexpect方法完成。
    #![allow(unused)]
    fn main() {
    // 如果`parse_int`返回`Err`则恐慌。
    let number = parse_int("42").unwrap();
    // `expect`允许你指定自定义的恐慌信息。
    let number = parse_int("42").expect("解析整数失败");
    }
  • 使用match表达式解构Result以显式处理错误情况。
    #![allow(unused)]
    fn main() {
    match parse_int("42") {
        Ok(number) => println!("解析的数字: {}", number),
        Err(err) => eprintln!("错误: {}", err),
    }
    }

参考资料

  • 本节练习位于 exercises/05_ticket_v2/07_unwrap