MST

星途 面试题库

面试题:Rust中可恢复异常与不可恢复异常的基本实现差异

请简述在Rust中,可恢复异常(如`Result`类型处理错误)和不可恢复异常(如`panic!`宏)在实现方式上有哪些基本差异,并各举一个简单的代码示例。
12.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

可恢复异常(Result类型)

  • 实现方式Result是一个枚举类型,定义为enum Result<T, E> { Ok(T), Err(E) }。通过返回Result类型,调用者可以选择对成功(Ok)和失败(Err)情况分别进行处理,使得程序可以从错误中恢复并继续执行。
  • 代码示例
fn divide(a: i32, b: i32) -> Result<i32, &'static str> {
    if b == 0 {
        Err("division by zero")
    } else {
        Ok(a / b)
    }
}

fn main() {
    let result = divide(10, 2);
    match result {
        Ok(value) => println!("The result is: {}", value),
        Err(error) => println!("Error: {}", error),
    }
}

不可恢复异常(panic!宏)

  • 实现方式panic!宏用于表示程序遇到了不可恢复的错误,例如访问越界的数组索引。当panic!被调用时,程序会打印错误信息,展开栈帧(unwind)并最终终止执行,除非程序在运行时启用了abort模式,这种情况下程序会立即终止而不展开栈帧。
  • 代码示例
fn main() {
    let numbers = vec![1, 2, 3];
    let value = numbers[10]; // 这里会触发 panic,因为索引 10 越界
    println!("This line will not be printed: {}", value);
}

在上述代码中,访问numbers[10]会触发panic!,程序在打印错误信息后终止。