use std::fs::File;
use std::io::{self, Read};
// 自定义错误类型
#[derive(Debug)]
struct MyError {
msg: String,
}
impl std::fmt::Display for MyError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.msg)
}
}
impl std::error::Error for MyError {}
fn read_number_from_file(file_path: &str) -> Result<i32, MyError> {
let mut file = File::open(file_path).map_err(|e| MyError {
msg: format!("Failed to open file: {}", e),
})?;
let mut content = String::new();
file.read_to_string(&mut content).map_err(|e| MyError {
msg: format!("Failed to read file: {}", e),
})?;
content.trim().parse().map_err(|e| MyError {
msg: format!("Failed to parse number: {}", e),
})
}
fn main() {
match read_number_from_file("test.txt") {
Ok(num) => println!("Read number: {}", num),
Err(e) => eprintln!("Error: {}", e),
}
// 或者使用?操作符在调用函数的函数中处理错误
// fn another_function() -> Result<(), MyError> {
// let num = read_number_from_file("test.txt")?;
// println!("Read number: {}", num);
// Ok(())
// }
}
Result
类型简介:在Rust中,Result
类型是一个枚举类型,用于处理可能出现的错误。它定义如下:
enum Result<T, E> {
Ok(T),
Err(E),
}
T
表示成功时返回的值的类型。
E
表示失败时返回的错误的类型。
- 代码解释:
- 自定义错误类型
MyError
:实现了Debug
、Display
和Error
trait,以便于调试、显示错误信息和作为错误类型使用。
read_number_from_file
函数:尝试从文件中读取内容并解析为整数。如果任何步骤失败,返回Err
包含自定义错误。?
操作符用于简化错误处理,如果Result
是Err
,则提前返回错误。
main
函数:使用match
表达式对read_number_from_file
的返回值进行处理。如果是Ok
,打印读取到的数字;如果是Err
,打印错误信息。也可以在调用函数(如another_function
)中使用?
操作符将错误向上传递,由调用者进一步处理。