use std::fs::read_to_string;
use std::io;
// 假设的自定义配置结构体和解析错误类型
struct Config;
struct ParseError;
fn read_config() -> Result<Config, ParseError> {
let content = match read_to_string("config.txt") {
Ok(content) => content,
Err(e) if e.kind() == io::ErrorKind::NotFound => return Ok(Config::default()),
Err(e) => return Err(ParseError),
};
parse_config(content)
}
fn parse_config(content: String) -> Result<Config, ParseError> {
// 这里假设解析逻辑,返回Config或ParseError
Ok(Config)
}
impl Default for Config {
fn default() -> Self {
Config
}
}
错误处理
- 文件读取错误:如果文件不存在,直接返回默认配置。对于其他文件读取错误,将其转换为解析错误(这里简单处理为返回
ParseError
,实际可根据业务细化)。
- 解析错误:由
parse_config
函数返回的ParseError
直接传递给调用者,调用者可根据该错误类型进行相应处理。
代码可读性和可维护性
- 模块化:将文件读取和配置解析分离为不同的函数,每个函数专注于单一职责,提高代码的可读性和可维护性。
- 模式匹配:使用
match
语句处理Result
类型,使错误处理逻辑清晰明了。对于不同类型的错误可以针对性处理,如文件不存在的情况。
- 错误类型自定义:定义自定义的
ParseError
,可以更精确地表达配置解析过程中可能出现的错误,便于调用者区分和处理不同类型的错误。同时Default
trait的实现,使得获取默认配置的逻辑简单直观。