MST

星途 面试题库

面试题:Rust中如何捕获和处理panic

请描述在Rust中捕获和处理panic的基本机制,写出相关代码示例,并解释unwrap和expect在处理可能引发panic情况时的区别。
15.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

Rust中捕获和处理panic的基本机制

在Rust中,可以使用Result类型来处理可能导致错误的操作。然而,对于一些不可恢复的错误,Rust提供了panic!宏。panic!宏会导致程序展开(unwind)栈,打印错误信息并终止程序,除非这个panic被捕获。

要捕获panic,可以使用std::panic::catch_unwind函数。catch_unwind会执行一个闭包,如果闭包中的代码paniccatch_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"),
    }
}

unwrapexpect在处理可能引发panic情况时的区别

  1. unwrap

    • unwrapResult类型的一个方法。当ResultOk时,unwrap返回其中的值;当ResultErr时,unwrap会触发一个panic,并使用默认的错误信息called unwrap()on anErr value
    let result: Result<i32, &str> = Err("解析失败");
    let value = result.unwrap(); // 这里会panic,因为是Err
    
  2. expect

    • expect同样是Result类型的方法。与unwrap类似,当ResultOk时,expect返回其中的值。但当ResultErr时,expect也会触发panic,不过expect允许你提供一个自定义的错误信息。
    let result: Result<i32, &str> = Err("解析失败");
    let value = result.expect("解析数字失败"); // 这里会panic,错误信息是"解析数字失败"
    

总的来说,expect在调试和错误定位时更有用,因为它提供的自定义错误信息能更好地帮助开发者理解错误发生的原因,而unwrap使用的是通用的默认错误信息。