错误定义:
let file_content = parse_file("test.txt");
if let Err(e) = file_content {
println!("Error: {:?}", e);
}
let file_content = parse_file2("test.txt");
if let Err(e) = file_content {
match e {
ParseFileError::File => println!("Error: File"),
ParseFileError::Parse(e) => println!("Error: Parse: {:?}", e),
}
}
fn parse_file(filename: &str) -> Result<i32, Box<dyn error::Error>> {
let content = fs::read_to_string(filename)?;
let i = content.parse()?;
Ok(i)
}
// error
enum ParseFileError {
File,
Parse(ParseIntError),
}
fn parse_file2(filename: &str) -> Result<i32,ParseFileError> {
let s = fs::read_to_string(filename).map_err(|_| ParseFileError::File)?;
let i = s.parse().map_err(|e| ParseFileError::Parse(e))?;
Ok(i)
}
2.自定义,必须要实现Debug 和 Dispaly
// 使用 `Display` 实现进行格式化输出
println!("{}", person); // 调用 Display 的 `fmt` 方法
// 使用 `Debug` 实现进行调试输出
println!("{:?}", person); // 调用 Debug 的 `fmt` 方法
use std::error::Error;
use std::fmt;
#[derive(Debug)]
pub struct ParsePaymentInfoError {
pub msg: String,
pub source: Option<Box<dyn Error>>,
}
impl fmt::Display for ParsePaymentInfoError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}: {}", self.msg, self.source.as_ref().map_or("None".to_string(), |e| e.to_string()))
}
}
// 实现 Error 特征,提供 source 方法
impl Error for ParsePaymentInfoError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
self.source.as_deref()
}
}
fn main() {
let card_number = "abc";
match card_number.parse::<u32>() {
Ok(value) => println!("Parsed value: {}", value),
Err(e) => {
let custom_error = ParsePaymentInfoError {
msg: "Failed to parse payment info".to_string(),
source: Some(Box::new(e)),
};
println!("Error: {}", custom_error);
// 调用 source() 方法
if let Some(source_error) = custom_error.source() {
println!("Caused by: {}", source_error); // 这里调用 source()
}
}
}
}