在Rust中编写自定义Error

前言

之前我们聊过,Result<T, E> 类型可以方便地用于错误传导,Result<T, E>是模板类型,实例化后可以是各种类型,但 Rust 要求传导的 Result 中的 E 是相同类型的,或者能够自动转化为相同类型。比如,下面这段代码编译就会报错。所以我们需要编写自己的 Error 类型,以同时包含系统错误和具体业务错误。

use std::io;
use std::fs::{File};fn read_fs() -> io::Result<()> {File::open("abc.txt")?;Ok(())
}fn user_err() -> Result<u32, String> {Err(String::from("test faill"))
}fn test() -> Result<u32, String>{read_fs()?;test()?;
}pub fn main() {test();
}

image.png

系统Error

在 Result<T, E> 中,E 表示一种错误,Rust 标准库已经定义一系列 Error,主要是 io Error。它的定义如下:

pub struct Error {repr: Repr,
}

我们可以通过它的关联函数 new,from,other,配合 ErrorKind 来生成一个io Error 用于Reuslt。

自定义 Error

我们要定义一个自己的 Error 类型,它既包含系统的 io Error,也包含业务 Error,定义如下

// 业务 Error 定义
enum WorkError {WorkErrorFirst,WorkErrorSecond,WorkErrorThird,
}// 复合 Error 定义
enum MyError {IoErr(std::io::Error),WorkErr(WorkError)
}

使用 MyError

fn read_fs() -> Result<(), MyError> {let ret = File::open("abc.txt");if let Err(e) = ret {return Err(MyError::IoErr(e));} else {println!("ret = {ret:?}");}Ok(())
}fn user_err() -> Result<(), MyError> {Err(MyError::WorkErr(WorkError::WorkErrorSecond))
}fn test() -> Result<(), MyError>{read_fs()?;user_err()?;Ok(())
}pub fn main() {let ret = test();match ret {Ok(_) => {println!("run test success");}Err(e) => {println!("run test fail");}}
}

在上述实现中,我们通过手动方式将 std::io::Error 转化为 MyError。也可以通过实现 From trait 来自动实现这种转化。

impl From<std::io::Error> for MyError {fn from(err: std::io::Error) -> Self {MyError::IoErr(err)}
}// 这样,read_fs 函数就可以简化如下:
fn read_fs() -> Result<(), MyError> {File::open("abc.txt")?;Ok(())
}

现在还有一个问题,在 main 函数中,我们无法打印 e 信息。通过简单的为 WorkError 和 MyError 类型增加 #[derive(Debug)] 声明,就可以直接打印 e 信息。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Jetbrains全家桶】PyCharm专业版学生用户申请(学信网)+Toolbox App安装配置教程(修改系统、配置和日志目录)

文章目录 一、Jetbrains学生用户免费使用1. [Jetbrains官网](https://www.jetbrains.com.cn/en-us/)新申请更新资料申请界面 2. [学信网](https://www.chsi.com.cn/xlcx/index.jsp)教育部学籍在线验证报告本人身份核验申请报告 二、安装Toolbox App[Toolbox App](https://www.j…

Qt 拖拽事件示例

一、引子 拖拽这个动作,在桌面应用程序中是非常实用和具有很友好的交互体验的。我们常见的譬如有,将文件拖拽到某个窗口打开,或者拖拽文件到指定位置上传;在绘图软件中,选中某个模板、并拖拽到画布上,画布上变回绘制该模板的图像… 诸如此类,数不胜数。 那么,在Qt中我…

开源项目Git Commit规范与ChangeLog

一&#xff0c;conventional commit(约定式提交) Conventional Commits 是一种用于给提交信息增加人机可读含义的规范。它提供了一组用于创建清晰的提交历史的简单规则。 1.1 作用 自动化生成 CHANGELOG基于提交类型&#xff0c;自动决定语义化的版本变更向项目相关合作开发…

shell脚本—循环语句

文章目录 循环语句循环含义1、for2、whilewhile循环 3、until4、双重循环及跳出循环 循环语句 echo命令&#xff1a;标准输出或提取shell变量的值 标准输出 [rootlocalhost ~]#echo 123456|passwd --stdin zhangsan 更改用户 zhangsan 的密码 。 passwd&#xff1a;所有的身…

SWMM模型INP解析

.INP文件解析 [OPTIONS]&#xff1a;SWMM软件运行前需要设置的参数 [RAINGAGES]雨水节点&#xff0c;核心设置雨水时间序列&#xff0c;可为INP内部数据也可为外部txt数据&#xff0c;TIMESERIES对应【TIMESERIES】模块&#xff0c;TS_1为时间序列名称 [TIMESERIES]&#xff0…

部署幻兽帕鲁联机服务器需要怎样配置的云服务器?

随着互联网技术的快速发展&#xff0c;多人在线游戏逐渐成为人们休闲娱乐的重要方式。作为一款备受欢迎的游戏&#xff0c;幻兽帕鲁以其独特的玩法吸引了大量玩家。为了获得更好的游戏体验&#xff0c;许多玩家选择在云服务器上自行部署幻兽帕鲁联机服务器。本文将详细介绍部署…

设置模式之责任链模式

目录 1.概述 2.结构 3.实现 4.总结 1.概述 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为性设计模式&#xff1b;它为请求创建了一个接收者对象的链&#xff0c;允许你将请求沿着处理者链进行发送。 收到请求后&#xff0c; 每个处理者均…

图像处理python基础

array 读取图片 tensor 模型预测 一般过程&#xff1a;读取数据np->tensor->model->result->np->画图 shape确保图像输入输出尺寸正确 读取图片 将在GPU上运行的tensor类型转变成在CPU上运行的np类型 三类计算机视觉任务的输入&#xff1a; 分类&#xff1…

【软考问题】-- 1 - 知识精讲 - 项目管理理论

一、基本问题 1&#xff1a;项目的特点是什么&#xff1f; 临时性&#xff1a;是指项目有明确的起点和终点&#xff0c;从项目启动到项目收尾。项目目标实现后&#xff0c;项目收尾工作完成即标志着项目结束。独特性&#xff1a;项目是独特的&#xff0c;之前没有做过的&#x…

JS高频面试题(上)

1. 介绍JS有哪些内置对象&#xff1f; 数据封装类对象&#xff1a;Object、Array、Boolean、Number、String 其他对象&#xff1a;Function、Arguments、Math、Date、RegExp、Error ES6新增对象&#xff1a;Symbol&#xff08;标识唯一性的ID&#xff09;、Map、Set、Promise…

Python + Selenium —— 网页元素定位之CSS 选择器!

CSS(Cascading Style Sheets)是一种语言&#xff0c;用来描述HTML和XML文档的样式。 CSS 选择器用来定位 HTML 上的元素&#xff0c;然后对其进行渲染。通过 CSS 选择器可以定位到页面上的任意元素。这些选择器可以被 WebDriver 用作另外的定位策略。 CSS 可以较为灵活的选择控…

蓝桥杯准备之路-Java基础复习

一、基本数据类型 int(32),long(64),float,double,boolean ,char 溢出判断&#xff1a; System.out.println("蓝桥杯练习第一天");Scanner scan new Scanner(System.in);int a scan.nextInt();System.out.println(a);int a1 Integer.MAX_VALUE;System.out.prin…

Linux管道学习(无名管道)

目录 1、概述 2、管道的创建 3、管道读写行为 3.1、管道读 在linux中管道有两种&#xff0c;一是无名管道&#xff08;匿名管道&#xff09;&#xff0c;第二种是有名管道&#xff1b;无名管道主要用于有血缘关系的父子进程间通信&#xff0c;有名管道则不受该限制&#xf…

字符串匹配(BF KMP)详解 + 刷题

目录 &#x1f33c;前言 BF 算法 KMP 算法 &#xff08;1&#xff09;前缀函数 -- O(n^3) &#xff08;2&#xff09;前缀函数 -- O(n^2) &#xff08;3&#xff09;前缀函数 -- O(n) &#xff08;4&#xff09;辅助理解 &#x1f40b;P1308 -- 统计单词数 …

文件包含技术总结

开发人员一般会把重复使用的函数写到单个文件中&#xff0c;需要使用某个函数时直接调用此文件&#xff0c;而无需再次编写&#xff0c;这中文件调用的过程一般被称为文件包含。 allow_url_fopen On&#xff08;是否允许打开远程文件&#xff09; allow_url_include On&…

机器学习算法(一)

一、线性回归 线性回归&#xff08;Linear Regression&#xff09;可能是最流行的机器学习算法。线性回归就是要找一条直线&#xff0c;并且让这条直线尽可能地拟合散点图中的数据点。它试图通过将直线方程与该数据拟合来表示自变量&#xff08;x 值&#xff09;和数值结果&am…

uniapp page宽度设置为750rpx,子元素宽度100%,大小不一致

uniapp page宽度设置为750rpx&#xff0c;子元素宽度100%&#xff0c;大小不一致。 原因是我在page加了margin: 0 auto;去掉就正常了&#xff08;但是如果在超大屏幕还是会出现&#xff0c;我猜是使用rpx导致的&#xff0c;rpx渲染成页面时会转成精确到一个小数点几位数的rem&a…

[实战]加密传输数据解密

前言 下面将分享一些实际的渗透测试经验&#xff0c;帮助你应对在测试中遇到的数据包内容加密的情况。我们将以实战为主&#xff0c;技巧为辅&#xff0c;进入逆向的大门。 技巧 开局先讲一下技巧&#xff0c;掌握好了技巧&#xff0c;方便逆向的时候可以更加快速的找到关键函数…

arcgis实现截图/截屏功能

arcgis实现截图/截屏功能 文章目录 arcgis实现截图/截屏功能前言效果展示相关代码 前言 本篇将使用arcgis实现截图/截屏功能&#xff0c;类似于qq截图 效果展示 相关代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><meta nam…

突发:Do Kwon申请破产!

作者&#xff1a;秦晋 1月22日&#xff0c;据《彭博社》报道&#xff0c; 由Do Kwon联合创立的Terraform Labs Pte.数字资产公司在美国特拉华州申请破产保护。 根据周日在特拉华州提交的法庭文件显示&#xff0c;该公司的资产和负债估计均在1亿至5亿美元之间&#xff0c;债权人…