MST

星途 面试题库

面试题:Rust富错误设计思路下的错误处理机制

在Rust富错误的设计思路中,阐述Result<T, E> 和 Option<T> 的区别与应用场景,并且分别举例说明如何在实际代码中使用它们进行错误处理。
30.7万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

区别

  1. 语义不同
    • Result<T, E> 用于表示操作可能成功或失败的情况。T 代表成功时返回的值类型,E 代表失败时返回的错误类型。它适用于那些明确可能出现错误,且需要区分不同错误类型的操作。
    • Option<T> 用于表示值可能存在或不存在的情况。T 代表可能存在的值类型。它主要用于处理值的存在性问题,比如空指针、空集合中的元素等,并不关心失败的原因。
  2. 错误处理粒度
    • Result<T, E> 能提供更细粒度的错误处理,因为 E 可以是自定义的错误类型,包含具体的错误信息。
    • Option<T> 仅简单表明值是否存在,没有具体的错误原因。

应用场景

  1. Result<T, E>
    • 适用于文件操作、网络请求等可能出现多种错误类型的场景。例如,打开文件可能因为文件不存在、权限不足等不同原因失败,这些不同原因可以通过不同的 E 类型表示。
  2. Option
    • 适用于处理可能为空的返回值,比如在集合中查找元素,元素可能不存在。

实际代码示例

  1. 使用 Result<T, E> 进行错误处理
use std::fs::File;
use std::io::Error;

fn read_file() -> Result<String, Error> {
    let file = File::open("example.txt")?;
    let mut contents = String::new();
    file.read_to_string(&mut contents)?;
    Ok(contents)
}

fn main() {
    match read_file() {
        Ok(contents) => println!("File contents: {}", contents),
        Err(e) => println!("Error reading file: {}", e),
    }
}

在上述代码中,read_file 函数返回 Result<String, Error>File::openread_to_string 操作都可能失败并返回 io::Error,使用 ? 操作符简洁地处理错误。 2. 使用 Option 进行错误处理

fn find_number_in_vec(vec: &[i32], target: i32) -> Option<&i32> {
    vec.iter().find(|&&num| num == target)
}

fn main() {
    let numbers = vec![1, 2, 3, 4, 5];
    match find_number_in_vec(&numbers, 3) {
        Some(number) => println!("Found number: {}", number),
        None => println!("Number not found"),
    }
}

在这个例子中,find_number_in_vec 函数返回 Option<&i32>,表示目标数字在向量中可能存在(Some)或不存在(None)。