MST

星途 面试题库

面试题:Rust错误处理与错误传播

在Rust中,有一个函数`fetch_user_data`,它会调用另一个函数`get_data_from_api`从API获取用户数据,`get_data_from_api`可能返回不同类型的错误,如网络错误`NetworkError`和解析错误`ParseError`,这两个错误类型都实现了`std::error::Error`。`fetch_user_data`需要将这些错误传播出去并进行适当处理,并且在调用`fetch_user_data`的地方需要统一捕获并打印错误信息。请写出`fetch_user_data`函数以及调用它的代码示例,并解释涉及的错误处理和错误传播机制。
42.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::error::Error;

// 定义网络错误类型
#[derive(Debug)]
struct NetworkError;

impl std::fmt::Display for NetworkError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "Network error occurred")
    }
}

impl Error for NetworkError {}

// 定义解析错误类型
#[derive(Debug)]
struct ParseError;

impl std::fmt::Display for ParseError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "Parse error occurred")
    }
}

impl Error for ParseError {}

// 模拟从API获取数据的函数
fn get_data_from_api() -> Result<String, Box<dyn Error>> {
    // 这里假设会随机返回一种错误来模拟真实情况
    if rand::random::<bool>() {
        Err(Box::new(NetworkError))
    } else {
        Err(Box::new(ParseError))
    }
}

// 定义fetch_user_data函数
fn fetch_user_data() -> Result<String, Box<dyn Error>> {
    get_data_from_api()
}

fn main() {
    match fetch_user_data() {
        Ok(data) => println!("Successfully fetched user data: {}", data),
        Err(e) => eprintln!("Error: {}", e),
    }
}

错误处理和错误传播机制解释

  1. 错误类型定义NetworkErrorParseError分别定义为结构体,并实现了std::fmt::Displaystd::error::Error trait,这样它们就能作为错误类型进行处理和传播。
  2. get_data_from_api函数:该函数可能返回NetworkErrorParseError,通过Result类型来表示可能的成功或失败,失败时返回Box<dyn Error>,这种方式实现了错误的向上传播。
  3. fetch_user_data函数:它简单地调用get_data_from_api并直接返回其结果,从而将get_data_from_api可能产生的错误继续向上传播。
  4. 错误捕获和处理:在main函数中,使用match语句对fetch_user_data的返回值进行处理。如果是Ok,则打印成功获取的数据;如果是Err,则使用eprintln!打印错误信息,因为错误信息通常应该输出到标准错误流。这种方式实现了在调用处统一捕获并处理可能发生的各种错误。