MST

星途 面试题库

面试题:Rust中panic后常用的恢复策略及场景

在Rust编程中,panic可能会由于多种原因发生,比如数组越界、解引用空指针等。请阐述至少两种panic后的恢复策略,并说明每种策略适用的场景。
22.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 不进行恢复(程序终止)

    • 适用场景:当发生的错误属于不可恢复的严重错误,比如程序内部逻辑被破坏,继续执行可能导致更严重的后果,如数据损坏或安全漏洞。例如在操作系统内核代码中,若出现解引用空指针的panic,继续执行可能导致整个系统崩溃,此时终止程序是更安全的选择。
  2. 使用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`进行相应处理,如提示用户或进行重试。