面试题答案
一键面试-
不进行恢复(程序终止):
- 适用场景:当发生的错误属于不可恢复的严重错误,比如程序内部逻辑被破坏,继续执行可能导致更严重的后果,如数据损坏或安全漏洞。例如在操作系统内核代码中,若出现解引用空指针的panic,继续执行可能导致整个系统崩溃,此时终止程序是更安全的选择。
-
使用
catch_unwind
恢复:- 代码示例:
use std::panic;
fn main() {
let result = panic::catch_unwind(|| {
// 可能导致panic的代码
let _x = 1 / 0;
});
if let Err(_) = result {
// 处理panic的代码
println!("Caught a panic!");
}
}
- **适用场景**:适用于那些虽然出现了panic,但我们希望程序能够继续运行的场景,比如在一个长时间运行的服务器程序中,某个请求处理逻辑出现panic,通过`catch_unwind`捕获并处理后,服务器仍可继续处理其他请求,避免整个服务器崩溃。
3. 使用unwrap_or_else
等方法处理Result
类型中的错误:
- 代码示例:
fn divide(a: i32, b: i32) -> Result<i32, String> {
if b == 0 {
Err("Division by zero".to_string())
} else {
Ok(a / b)
}
}
fn main() {
let result = divide(10, 0).unwrap_or_else(|e| {
println!("Error: {}", e);
0
});
println!("Final result: {}", result);
}
- **适用场景**:在代码逻辑中提前使用`Result`类型来处理可能的错误,避免直接panic。这种方式适用于可以提前预判并处理的错误场景,比如文件读取操作,文件不存在时可以返回错误而不是panic,调用者可以根据返回的`Result`进行相应处理,如提示用户或进行重试。