MST

星途 面试题库

面试题:Rust中unwrap_or_else与expect错误处理的基础差异

请简要阐述Rust中unwrap_or_else和expect在错误处理机制上的主要区别,并各举一个简单示例代码说明。
30.2万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

区别

  1. unwrap_or_else
    • ResultOk时,返回Ok中的值。
    • ResultErr时,执行传入的闭包,并返回闭包的结果。它允许根据错误情况动态生成一个默认值。
  2. expect
    • ResultOk时,返回Ok中的值。
    • ResultErr时,expect会使程序恐慌(panic),并打印出传入的错误信息。它主要用于调试和开发阶段,当某个操作不应该失败但实际失败时,用expect可以快速定位问题。

示例代码

  1. unwrap_or_else示例
fn divide(a: i32, b: i32) -> Result<i32, &'static str> {
    if b == 0 {
        Err("division by zero")
    } else {
        Ok(a / b)
    }
}

fn main() {
    let result1 = divide(10, 2);
    let result2 = divide(10, 0);

    let value1 = result1.unwrap_or_else(|_| 0);
    let value2 = result2.unwrap_or_else(|err| {
        println!("Error: {}", err);
        -1
    });

    println!("Value1: {}", value1);
    println!("Value2: {}", value2);
}
  1. expect示例
fn divide(a: i32, b: i32) -> Result<i32, &'static str> {
    if b == 0 {
        Err("division by zero")
    } else {
        Ok(a / b)
    }
}

fn main() {
    let result1 = divide(10, 2);
    let result2 = divide(10, 0);

    let value1 = result1.expect("Division should succeed");
    let value2 = result2.expect("Division should not fail");
    println!("Value1: {}", value1);
    println!("Value2: {}", value2);
}

在上述expect示例中,result2.expect("Division should not fail")会导致程序恐慌并打印出Division should not fail以及错误信息division by zero。而unwrap_or_else示例中,result2Err时,会执行闭包,打印错误信息并返回-1