面试题答案
一键面试Rust中捕获和处理panic的基本机制
在Rust中,可以使用Result
类型来处理可能导致错误的操作。然而,对于一些不可恢复的错误,Rust提供了panic!
宏。panic!
宏会导致程序展开(unwind)栈,打印错误信息并终止程序,除非这个panic
被捕获。
要捕获panic
,可以使用std::panic::catch_unwind
函数。catch_unwind
会执行一个闭包,如果闭包中的代码panic
,catch_unwind
会捕获这个panic
,返回Err
,否则返回Ok
。
代码示例
use std::panic;
fn main() {
let result = panic::catch_unwind(|| {
// 可能会panic的代码
let x: i32 = "not a number".parse().unwrap();
});
match result {
Ok(_) => println!("没有发生panic"),
Err(_) => println!("发生了panic"),
}
}
unwrap
和expect
在处理可能引发panic情况时的区别
-
unwrap
:unwrap
是Result
类型的一个方法。当Result
是Ok
时,unwrap
返回其中的值;当Result
是Err
时,unwrap
会触发一个panic
,并使用默认的错误信息called
unwrap()on an
Errvalue
。
let result: Result<i32, &str> = Err("解析失败"); let value = result.unwrap(); // 这里会panic,因为是Err
-
expect
:expect
同样是Result
类型的方法。与unwrap
类似,当Result
是Ok
时,expect
返回其中的值。但当Result
是Err
时,expect
也会触发panic
,不过expect
允许你提供一个自定义的错误信息。
let result: Result<i32, &str> = Err("解析失败"); let value = result.expect("解析数字失败"); // 这里会panic,错误信息是"解析数字失败"
总的来说,expect
在调试和错误定位时更有用,因为它提供的自定义错误信息能更好地帮助开发者理解错误发生的原因,而unwrap
使用的是通用的默认错误信息。