当前位置: 首页 > article >正文

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


http://www.kler.cn/a/517900.html

相关文章:

  • 简易CPU设计入门:控制总线的剩余信号(二)
  • 嵌入式基础 -- PCIe 控制器中断管理之MSI与MSI-X简介
  • C语言学习强化
  • npm启动前端项目时报错(vue) error:0308010C:digital envelope routines::unsupported
  • MySQL入门(数据库、数据表、数据、字段的操作以及查询相关sql语法)
  • 【C++初阶】第11课—vector
  • 「全网最细 + 实战源码案例」设计模式——生成器模式
  • Pytest插件介绍:pytest-django
  • iOS 网络请求: Alamofire 结合 ObjectMapper 实现自动解析
  • 新型人工智能“黑帽”工具:GhostGPT带来的威胁与挑战
  • 深度学习中Batch Normalization(BN)原理、作用浅析
  • 食堂校园预约就餐小程序ssm+论文源码调试讲解
  • SpringAI 搭建智能体(二):搭建客服系统智能体
  • html新增Canvans
  • deep face cam 部署报错解决
  • 【游戏设计原理】81 - 功能可见性暗示
  • 量子编程语言:Qiskit 与 Cirq
  • OpenHarmonyOS 3.2 编译生成的hap和app文件的名称如何配置追加版本号?
  • Three城市引擎地图插件Geo-3d
  • tkinter防抖数字输入框
  • 深入解析Java集合框架:春招面试要点
  • wlan和vlan
  • Spring 框架:配置缓存管理器、注解参数与过期时间
  • 自定义数据集使用scikit-learn中的包实现线性回归方法对其进行拟合
  • 如何将硬盘克隆到另一个硬盘或是固态硬盘?(免费)
  • Kafka 日志存储 — 日志清理