rust map_err 的用法
map_err是Rust中Result
核心作用和用法
转换错误类型: 当你调用一个返回Result的函数,但其错误类型E1不符合你当前函数所需的错误类型E2时,map_err(|e: E1| -> E2 { ... })可以将错误从E1转换为E2.
保持Ok值: map_err只关心Err变体,如果原始Result是Ok(value),它会原封不动地返回Ok(value).
示例
假设一个函数read_file可能返回io::Error,但你希望在自己的程序中处理为自定义的AppError。
use std::io;
use std::fs::File;
use std::error::Error;
#[derive(Debug)] // 方便打印
enum AppError {
Io(io::Error), // 包装了IO错误
NotFound, // 自定义错误
}
// 模拟一个可能返回io::Error的函数
fn read_file(path: &str) -> Result<String, io::Error> {
// 实际应是文件读取操作
Err(io::Error::new(io::ErrorKind::NotFound, "File not found"))
}
fn process_file(path: &str) -> Result<String, AppError> {
read_file(path)
.map_err(|err| { // 将io::Error映射到AppError::Io
println!("原始IO错误: {}", err);
AppError::Io(err)
})
// 假设我们还需要一个检查,如果文件不存在,返回自定义错误
.and_then(|content| {
if content.is_empty() {
Err(AppError::NotFound)
} else {
Ok(content)
}
})
}
fn main() {
let result = process_file("non_existent.txt");
match result {
Ok(content) => println!("成功: {}", content),
Err(AppError::Io(e)) => println!("IO错误处理: {}", e),
Err(AppError::NotFound) => println!("找不到文件错误处理"),
}
}
常见应用场景
与?结合: 在Result链中,使用map_err转换上游的错误,然后用?传播,非常整洁. 统一错误类型: 确保一个函数或模块返回的错误类型一致,方便调用方处理.
适配不同库的错误: 将std::fs::File::open的io::Error转换为更具体的业务错误类型.
map_err是Rust优雅错误处理的基石之一,让你能灵活地控制错误流向和类型
文档信息
版权声明:可自由转载(请注明转载出处)-非商用-非衍生
发表时间:2025年12月31日 09:25