MST

星途 面试题库

面试题:Rust中自定义错误类型与异常处理

在Rust中,如何自定义一个错误类型并将其与Result类型结合使用进行异常处理?假设你正在开发一个文件读取的模块,需要处理文件不存在、权限不足等不同类型的错误。请展示如何定义错误类型,以及在读取文件函数中如何返回相应的错误。
21.2万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 定义错误类型: 可以通过定义一个枚举类型来表示不同的错误情况。
    // 定义文件读取错误类型
    #[derive(Debug)]
    enum FileReadError {
        FileNotFound,
        PermissionDenied,
        // 可以添加更多错误情况
    }
    
  2. 在读取文件函数中返回相应的错误: 函数使用Result类型来返回读取的内容或者错误。
    use std::fs::File;
    use std::io::{self, Read};
    
    fn read_file(file_path: &str) -> Result<String, FileReadError> {
        let mut file = match File::open(file_path) {
            Ok(file) => file,
            Err(error) => {
                if error.kind() == io::ErrorKind::NotFound {
                    return Err(FileReadError::FileNotFound);
                } else if error.kind() == io::ErrorKind::PermissionDenied {
                    return Err(FileReadError::PermissionDenied);
                }
                // 这里可以添加处理其他错误类型的逻辑
                panic!("Unexpected error: {:?}", error);
            }
        };
    
        let mut contents = String::new();
        match file.read_to_string(&mut contents) {
            Ok(_) => Ok(contents),
            Err(error) => {
                // 这里也可以根据具体错误情况返回更合适的错误类型
                panic!("Unexpected read error: {:?}", error);
            }
        }
    }
    

在上述代码中:

  • 首先定义了FileReadError枚举来表示文件读取过程中可能出现的错误类型。
  • read_file函数接收一个文件路径,尝试打开文件并读取其内容。如果文件不存在,返回FileReadError::FileNotFound;如果权限不足,返回FileReadError::PermissionDenied。读取文件内容成功则返回包含文件内容的Ok结果。如果出现其他未处理的错误,这里简单地使用panic!,实际应用中可以根据需要更合理地处理。