MST

星途 面试题库

面试题:Rust错误处理策略之Result类型与?操作符的深入应用

假设有一个函数`read_file`,它接收一个文件名作为参数,尝试读取文件内容并返回`Result<String, 自定义错误类型>`。要求使用`?`操作符处理可能出现的错误,并结合`From` trait将标准库错误转换为自定义错误类型。请实现这个函数,并解释`?`操作符在这个过程中的作用。
15.5万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

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

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

// 实现From trait,将标准库错误转换为自定义错误类型
impl From<io::Error> for CustomError {
    fn from(err: io::Error) -> Self {
        CustomError {
            msg: err.to_string(),
        }
    }
}

fn read_file(filename: &str) -> Result<String, CustomError> {
    let mut file = File::open(filename)?;
    let mut contents = String::new();
    file.read_to_string(&mut contents)?;
    Ok(contents)
}

?操作符在这个过程中的作用:当File::openfile.read_to_string调用返回Err时,?操作符会将这个错误值自动转换为函数的返回类型Result<String, CustomError>中的Err值。如果这个错误类型实现了From trait可以转换为CustomError,那么?操作符会调用From::from方法进行转换,然后直接返回这个Err值,终止函数执行。如果调用返回Ok值,?操作符会提取其中的值继续执行后续代码。这样可以大大简化错误处理代码,避免冗长的match语句或手动处理错误返回值。