MST

星途 面试题库

面试题:Rust中Result枚举在复杂文件操作场景下的错误处理

假设有一个场景,需要先读取一个配置文件,根据配置文件中的信息决定是否要创建或修改另一个数据文件。请编写Rust代码实现这一过程,在每一步文件操作中都合理使用Result枚举处理错误,并在出现错误时,将错误信息以合适的形式进行记录和报告,同时尽可能保证资源的正确释放。
24.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::fs::{self, File};
use std::io::{self, Write};
use std::path::Path;

// 记录错误信息到文件,这里简单实现为写入一个log文件
fn log_error(error: &str) {
    let mut file = File::create("error.log").unwrap_or_else(|e| {
        panic!("无法创建错误日志文件: {}", e);
    });
    file.write_all(error.as_bytes()).unwrap_or_else(|e| {
        panic!("无法写入错误日志: {}", e);
    });
}

fn main() {
    let config_path = Path::new("config.txt");
    let data_path = Path::new("data.txt");

    // 读取配置文件
    let config_content = fs::read_to_string(config_path).map_err(|e| {
        let error_msg = format!("读取配置文件失败: {}", e);
        log_error(&error_msg);
        e
    })?;

    // 根据配置文件内容决定是否创建或修改数据文件
    if config_content.contains("create_or_modify") {
        let mut data_file = File::options()
          .write(true)
          .create(true)
          .open(data_path)
          .map_err(|e| {
                let error_msg = format!("打开或创建数据文件失败: {}", e);
                log_error(&error_msg);
                e
            })?;

        let new_data = "新的数据内容";
        data_file.write_all(new_data.as_bytes()).map_err(|e| {
            let error_msg = format!("写入数据文件失败: {}", e);
            log_error(&error_msg);
            e
        })?;
    }

    println!("操作完成");
}

代码说明:

  1. log_error函数:用于将错误信息记录到error.log文件中。如果创建或写入文件失败,会panic,实际应用中可更优雅处理。
  2. 读取配置文件:使用fs::read_to_string读取配置文件内容,若失败,记录错误日志并返回错误。
  3. 创建或修改数据文件:根据配置文件内容判断是否需要操作数据文件。若需要,使用File::options打开或创建数据文件,写入数据,若操作失败,记录错误日志并返回错误。