面试题答案
一键面试常见场景导致未处理错误
Option::unwrap
用于可能为None
的情况:fn main() { let maybe_number: Option<i32> = None; let number = maybe_number.unwrap(); // 这里会导致程序panic,因为`maybe_number`是`None`,没有值可解包 println!("The number is: {}", number); }
Result::unwrap
用于可能为Err
的情况:use std::fs::File; fn main() { let file = File::open("nonexistent_file.txt").unwrap(); // 如果文件不存在,会返回`Err`,这里`unwrap`会导致panic println!("File opened successfully: {:?}", file); }
避免这些错误的方法
- 对于
Option
类型:- 使用
if let
:let maybe_number: Option<i32> = Some(42); if let Some(number) = maybe_number { println!("The number is: {}", number); } else { println!("No number was present."); }
- 使用
unwrap_or
或unwrap_or_else
:let maybe_number: Option<i32> = None; let number = maybe_number.unwrap_or(0); // 如果是`None`,返回默认值0 println!("The number is: {}", number); let maybe_number: Option<i32> = None; let number = maybe_number.unwrap_or_else(|| { // 可以执行更复杂的逻辑来生成默认值 println!("Calculating default value..."); 100 }); println!("The number is: {}", number);
- 使用
- 对于
Result
类型:- 使用
match
:use std::fs::File; fn main() { let result = File::open("nonexistent_file.txt"); match result { Ok(file) => println!("File opened successfully: {:?}", file), Err(e) => println!("Error opening file: {}", e), } }
- 使用
unwrap_or_else
:use std::fs::File; fn main() { let file = File::open("nonexistent_file.txt").unwrap_or_else(|e| { eprintln!("Error opening file: {}", e); std::process::exit(1); }); println!("File opened successfully: {:?}", file); }
- 使用
?
操作符:use std::fs::File; fn open_file() -> std::io::Result<File> { let file = File::open("nonexistent_file.txt")?; Ok(file) } fn main() { match open_file() { Ok(file) => println!("File opened successfully: {:?}", file), Err(e) => println!("Error opening file: {}", e), } }
- 使用
?
操作符会自动将Err
值返回,让调用者来处理错误,而不是直接panic
。