解包处理
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
的函数时,你有两个主要选择:
- 如果操作失败,则恐慌。
这通常使用
unwrap
或expect
方法完成。#![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