Rust 实战thiserror+自定义错误消息体

导航

  • 一、背景
  • 二、实践
    • 1、导入thiserror
    • 2、自定义错误消息体
      • (1)创建ErrMsg.rs和创建自定义结构体
      • (2)lib.rs添加ErrMsg
      • (3)main函数
      • (4)完整代码

一、背景

开发中遇到需要通用、能够满足自定义 的错误输出方式,
thiserror是一个不错的工具包,在此基础上我还想加一些自定义的错误消息体,比如HTTP类的错误信息,打印状态码和错误内容

二、实践

1、导入thiserror

thiserror = "1.0"

2、自定义错误消息体

(1)创建ErrMsg.rs和创建自定义结构体

若想能够打印错误信息,为自定义结构体实现display和Debug特征,看完整代码

use crate::Display;
use std::error::Error;
use std::fmt::Debug;
use std::fmt::{self};
// ErrMsg 是自定义错误类型,
// 为 ErrMsg 自动派生 Debug 特征
#[derive(Debug)]
pub struct ErrMsg {
    pub code: u32,
    pub msg: String,
}

// 为 AppError 实现 std::fmt::Display 特征
impl fmt::Display for ErrMsg {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "ErrMsg: {{code:{},msg :{} }}", self.code, self.msg) // user-facing output
    }
}

pub fn print_err<E>(e: E)
where
    E: Display + Debug + Error,
{
    print!("{}", e);
}

(2)lib.rs添加ErrMsg

// src/lib.rs
pub mod ErrBean;

(3)main函数

使用thiserror 定义枚举,枚举应该包括你需要的所有Error类型

enum MyError {
    #[error("invalid argument: {0}")]
    InvalidArgument(String),
    #[error("io error: {0}")]
    IoError(#[from] std::io::Error),
    #[error("this is display trait  output  :{0}")]//ErrMsg的display的输出,会替换这里的{0}
    ErrMsg(ErrMsg),
}

完整main函数

use hello_package::ErrBean::*;
use std::fmt::{self};
use std::fs::File;
use std::io::{self, Read};
use thiserror::Error;
#[derive(Error, Debug)]
enum MyError {
    #[error("invalid argument: {0}")]
    InvalidArgument(String),
    #[error("io error: {0}")]
    IoError(#[from] std::io::Error),
    #[error("this is display trait  output  :{0}")]
    ErrMsg(ErrMsg),
}
fn read_username_from_file() -> Result<String, MyError> {
    // 打开文件,f是`Result<文件句柄,io::Error>`
    let f = File::open("hello.txt");

    let mut f = match f {
        // 打开文件成功,将file句柄赋值给f
        Ok(file) => file,
        // 打开文件失败,将错误返回(向上传播)
        Err(e) => return Err(MyError::IoError(e)),
    };
    // 创建动态字符串s
    let mut s = String::new();
    // 从f文件句柄读取数据并写入s中
    match f.read_to_string(&mut s) {
        // 读取成功,返回Ok封装的字符串
        Ok(_) => Ok(s),
        // 将错误向上传播
        Err(e) => return Err(MyError::IoError(e)),
    }
}
fn produce_error() -> Result<String, MyError> {
    let err_msg = ErrMsg {
        code: 400,
        msg: String::from("自定义错误内容"),
    };
    Err(MyError::ErrMsg(err_msg))
}

fn main() {
    let res = produce_error();//可以替换成read_username_from_file
    if let Ok(e) = res {
        print!("{}", e);
    } else if let Err(e) = res {
        print!("{}", e);
    }
}

输出结果为

this is display trait  output  :ErrMsg: {code:400,msg :自定义错误内容 }%   

(4)完整代码

为了保证模块化开发,关于错误实体的定义和方法实现应该都放到一个rs文件中,别的文件需要使用时直接导入就好,所以ErrMsg.rs用来定义我们的thiserror和自定义错误消息结构体
ErrMsg.rs

use core::fmt::Display;
use std::error::Error;
use std::fmt::Debug;
use std::fmt::{self};

use thiserror::Error;
#[derive(Error, Debug)]
pub enum MyError {
  #[error("invalid argument: {0}")]//{0}是占位符号,原本error的打印信息会替换这个占位符
  InvalidArgument(String),
  #[error("io error: {0}")]
  IoError(#[from] std::io::Error),
  #[error("this is display trait  output  :{0}")]
  ErrMsg(ErrMsg),
}

// ErrMsg 是自定义错误类型,它可以是当前包中定义的任何类型,在这里为了简化,我们使用了单元结构体作为例子。
// 为 ErrMsg 自动派生 Debug 特征
#[derive(Debug)]
pub struct ErrMsg {
    pub code: u32,
    pub msg: String,
}

// 为 ErrMsg 实现 std::fmt::Display 特征
impl fmt::Display for ErrMsg {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "ErrMsg: {{code:{},msg :{} }}", self.code, self.msg) // user-facing output
    }
}

pub fn print_err<E>(e: E)
where
    E: Display + Debug + Error,
{
    print!("{}", e);
}

main.rs

use hello_package::ErrBean::*;
use std::fmt::{self};
use std::fs::File;
use std::io::{self, Read};

fn read_username_from_file() -> Result<String, MyError> {
    // 打开文件,f是`Result<文件句柄,io::Error>`
    let f = File::open("hello.txt");

    let mut f = match f {
        // 打开文件成功,将file句柄赋值给f
        Ok(file) => file,
        // 打开文件失败,将错误返回(向上传播)
        Err(e) => return Err(MyError::IoError(e)),
    };
    // 创建动态字符串s
    let mut s = String::new();
    // 从f文件句柄读取数据并写入s中
    match f.read_to_string(&mut s) {
        // 读取成功,返回Ok封装的字符串
        Ok(_) => Ok(s),
        // 将错误向上传播
        Err(e) => return Err(MyError::IoError(e)),
    }
}
fn produce_error() -> Result<String, MyError> {
    let err_msg = ErrMsg {
        code: 400,
        msg: String::from("自定义错误内容"),
    };
    Err(MyError::ErrMsg(err_msg))
}

fn main() {
    let res = produce_error();
    if let Ok(e) = res {
        print!("{}", e);
    } else if let Err(e) = res {
        print!("{}", e);
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/594666.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Note-backbone预训练权重对模型收敛速度的影响和mmlab实验测试

简介 在训练一些复杂模型时候&#xff0c;通常会考虑读取backbone的预训练权重&#xff0c;这种方法有以下好处&#xff1a; 初始化网络参数&#xff1a;在深度学习模型训练过程中&#xff0c;通常需要随机初始化神经网络的参数。然而&#xff0c;如果采用Backbone预训练权重进…

拼多多不花钱推广能做起来吗

拼多多推广可以使用3an推客。3an推客&#xff08;CPS模式&#xff09;给商家提供的营销工具&#xff0c;由商家自主设置佣金比例&#xff0c;激励推广者去帮助商家推广商品链接&#xff0c;按最终有效交易金额支付佣金&#xff0c;不成交不扣费。是商家破零、积累基础销量的重要…

背景音乐广播系统解决方案

背景音乐广播系统解决方案18123651365 在公共广播背景音乐系统虽然是一个小小分支&#xff0c;但是却与人们的生活质量直接挂钩&#xff0c;如早晨时间&#xff0c;可以通过播放一些愉快的音乐&#xff0c;使得住宅居名、上班一族和晨运一族有一个愉快的心情&#xff0c;精神抖…

《QT实用小工具·五十六》自适应界面变化的控件

1、概述 源码放在文章末尾 该项目实现了网格显示多张带文字的图片在界面中自适应布局 特点 跟随窗口大小变换位置&#xff0c;并带移动动画 响应鼠标事件&#xff0c;图片缩放动画 点击水波纹动画 项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #i…

剖析QMS质量管理系统:推动企业效益提升的关键因素

质量管理系统&#xff08;QMS&#xff09;是企业管理中至关重要的一环&#xff0c;它涵盖了组织的所有流程和活动&#xff0c;并旨在提高产品和服务的质量。通过实施和运营一个有效的QMS&#xff0c;企业能够不断改进其业务&#xff0c;满足客户需求&#xff0c;提高竞争力&…

书生浦语第三节茴香豆:搭建你的RAG智能助理笔记

RAG&#xff08;Retrieval Augmented Generation&#xff09;是一项通过检索与用户输入相关的信息片段&#xff0c;并结合外部知识库来生成更准确、更丰富的回答的技术。解决 LLMs 在处理知识密集型任务时可能遇到的挑战, 如幻觉、知识过时和缺乏透明、可追溯的推理过程等。提供…

4月威胁态势 | 0day占比82%!Polyransom勒索家族强势来袭

近日&#xff0c;亚信安全正式发布《2024年4月威胁态势报告》&#xff08;以下简称“报告”&#xff09;&#xff0c;报告显示&#xff0c;4月份新增安全漏洞1260个&#xff0c;涉及0day漏洞占82%&#xff1b;监测发现当前较活跃的勒索病毒家族是Polyransom和Blocker&#xff0…

SPI思想机制

目录 如何解释简单概括SPI 和 APISPI 实现原理&#xff08;重要-线程上下文类加载器&#xff09; 如何使用一个Demo功能介绍使用效果&#xff08;直接在本地模拟服务商提供服务&#xff09;使用效果&#xff08;通过 jar 的方式引入&#xff09; 应用分析参考文章 如何解释 简…

Docker容器:Docker-Consul的容器服务更新与发现

目录 前言 一、什么是服务注册与发现 二、 Docker-Consul 概述 1、Consul 概念 2、Consul 提供的一些关键特性 3、Consul 的优缺点 4、传统模式与自动发现注册模式的区别 4.1 传统模式 4.2 自动发现注册模式 5、Consul 核心组件 5.1 Consul-Template组件 5.2 Consu…

Blazor流程编排的艺术:深入Z.Blazor.Diagrams库的使用与实践

合集 - .Net(3)1.基于AntSK与LLamaSharp打造私人定制的离线AI知识库03-032.深入解析&#xff1a;AntSK 0.1.7版本的技术革新与多模型管理策略03-123.Blazor流程编排的艺术&#xff1a;深入Z.Blazor.Diagrams库的使用与实践05-05收起 为现代网页应用开发提供动力的其中一…

招展工作的接近尾声“2024上海国际科技创新展会”即将盛大开幕

2024上海国际科技创新展会&#xff0c;即将于6月中旬在上海新国际博览中心盛大召开。随着招展工作的接近尾声&#xff0c;目前仍有少量余位可供各企业和机构预定。这一盛大的科技展会&#xff0c;将汇聚全球智能科技领域的精英&#xff0c;共同展示最新的科技成果&#xff0c;探…

【Spring】JdbcTemplate

JdbcTemplate 是 Spring 提供的一个 JDBC 模板类&#xff0c;是对 JDBC 的封装&#xff0c;简化 JDBC 代码 也可以让 Spring 集成其它的 ORM 框架&#xff0c;例如&#xff1a;MyBatis、Hibernate 等 使用 JdbcTemplate 完成增删改查 一、环境准备 数据库&#xff1a; 准备…

【JavaEE 初阶(二)】线程安全问题

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多线程知识 目录 1.前言2.synchronized2.1例子2.2synchronized修饰代码块2.3 synchronized修饰方法2.4sy…

one command each day on Linux- big synopsis

url address 1.12) grep Linux下面查找文本命令grep, 类似于Window编辑器的ctrlF查找我们想要的内容, PS:对比learning skill 看一下它的基础用法,准备一个目录文件和文本文件, 打印出这个单词,或者包含有这个字母的所有字符串 [rootiZ2vc5lqzt23aweti4j777Z ~]# grep hel…

智慧校园需要从哪些维度去做?

智慧校园作为校园信息化的关键产品&#xff0c;已经成为校园建设的标配。智慧校园是一个业务平台&#xff0c;他涉及校园事务的各个方面。智慧校园同时又是一个数据中心&#xff0c;他存储了所有的校园基础数据与业务数据&#xff0c;包括教工数据、学工数据、教务数据等。那么…

嘴尚绝卤味:传承经典,缔造美食新风尚

卤味&#xff0c;作为中国传统美食的代表之一&#xff0c;历经千年的传承与发展&#xff0c;早已成为无数食客餐桌上的宠儿。而在这个美食盛行的时代&#xff0c;嘴尚绝卤味凭借其独特的口感和精湛的工艺&#xff0c;成为卤味市场中的佼佼者&#xff0c;引领着卤味文化的新潮流…

基于java,SpringBoot和Vue的智慧校园在线考试留言讨论系统设计

摘要 基于Java, SpringBoot和Vue的智慧校园在线考试留言讨论系统是一个为现代教育需求定制的Web应用&#xff0c;它结合了最新的前后端技术来提供一个互动性强、用户友好的学习和交流平台。该系统旨在通过提供实时留言和讨论功能&#xff0c;增进学生间的互动以及师生之间的沟…

Altman确认:神秘Chatbot非GPT-4.5,OpenAI搜索引擎即将上线

&#x1f680; Altman确认&#xff1a;神秘Chatbot非GPT-4.5&#xff0c;OpenAI搜索引擎即将上线 摘要&#xff1a;近日&#xff0c;Sam Altman在哈佛大学的演讲中确认&#xff0c;引发广泛猜测的gpt2-chatbot并非OpenAI即将发布的下一代模型GPT-4.5。与此同时&#xff0c;关于…

游戏AI的智能化:机器学习在虚拟生命中的应用

文章目录 写在前面游戏AI的智能化&#xff1a;机器学习在虚拟生命中的应用游戏内容的自动化创作&#xff1a;机器学习的革新性应用玩家体验的个性化优化&#xff1a;机器学习的定制化力量未来展望&#xff1a;机器学习塑造游戏行业新纪元游戏AI的智能化发展自动化内容生成的革命…
最新文章