Bootstrap

rust 自定义错误(十二)

错误定义:

    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()
            }
        }
    }
}

;