MST

星途 面试题库

面试题:Rust错误处理之Result类型使用

请描述在Rust中如何使用`Result`类型来处理可能出现的错误。假设你有一个函数,该函数从文件中读取整数,如果读取失败返回一个自定义错误。请写出该函数的代码示例,并说明如何调用这个函数并处理可能返回的错误。
39.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::fs::File;
use std::io::{self, Read};

// 自定义错误类型
#[derive(Debug)]
struct MyError {
    msg: String,
}

impl std::fmt::Display for MyError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{}", self.msg)
    }
}

impl std::error::Error for MyError {}

fn read_number_from_file(file_path: &str) -> Result<i32, MyError> {
    let mut file = File::open(file_path).map_err(|e| MyError {
        msg: format!("Failed to open file: {}", e),
    })?;
    let mut content = String::new();
    file.read_to_string(&mut content).map_err(|e| MyError {
        msg: format!("Failed to read file: {}", e),
    })?;
    content.trim().parse().map_err(|e| MyError {
        msg: format!("Failed to parse number: {}", e),
    })
}

fn main() {
    match read_number_from_file("test.txt") {
        Ok(num) => println!("Read number: {}", num),
        Err(e) => eprintln!("Error: {}", e),
    }
    // 或者使用?操作符在调用函数的函数中处理错误
    // fn another_function() -> Result<(), MyError> {
    //     let num = read_number_from_file("test.txt")?;
    //     println!("Read number: {}", num);
    //     Ok(())
    // }
}
  1. Result类型简介:在Rust中,Result类型是一个枚举类型,用于处理可能出现的错误。它定义如下:
    enum Result<T, E> {
        Ok(T),
        Err(E),
    }
    
    • T表示成功时返回的值的类型。
    • E表示失败时返回的错误的类型。
  2. 代码解释
    • 自定义错误类型MyError:实现了DebugDisplayError trait,以便于调试、显示错误信息和作为错误类型使用。
    • read_number_from_file函数:尝试从文件中读取内容并解析为整数。如果任何步骤失败,返回Err包含自定义错误。?操作符用于简化错误处理,如果ResultErr,则提前返回错误。
    • main函数:使用match表达式对read_number_from_file的返回值进行处理。如果是Ok,打印读取到的数字;如果是Err,打印错误信息。也可以在调用函数(如another_function)中使用?操作符将错误向上传递,由调用者进一步处理。