在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中我…

Flink窗口类型功能汇总

Flink窗口类型功能汇总 Flink 中的 WindowAssigner 有多种实现类&#xff0c;每种实现类都有不同的作用。以下是一些常见的 WindowAssigner 实现类&#xff1a; TumblingEventTimeWindows&#xff1a; 将事件时间划分为固定大小的窗口。 SlidingEventTimeWindows&#xff1a; 将…

开源项目Git Commit规范与ChangeLog

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

Redis面试题30

容器编排是什么&#xff1f;为什么容器编排工具在容器化应用中很重要&#xff1f;有哪些常见的容器编排工具&#xff1f; 答&#xff1a;容器编排是指管理和协调容器集群的过程&#xff0c;它涉及到自动化部署、伸缩、网络通信、服务发现等任务。容器编排工具可以帮助用户简化和…

shell脚本—循环语句

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

《深度解析Docker命令:从入门到高级应用》

《深度解析Docker命令&#xff1a;从入门到高级应用》 1. 引言 Docker作为目前最热门的容器化技术之一&#xff0c;具有轻量、快速启动、隔离性好等优势&#xff0c;因此备受开发者喜爱。而熟练掌握Docker命令是使用这一技术的基础。本博客将详细介绍Docker中一些基础命令和高…

老兵(6)

和刚入职场的年轻人聊天&#xff0c;气氛总是可以非常欢快。 一晃眼这么多年过去了&#xff0c;好像变了很多&#xff0c;又好像什么都没变。一样的成长的烦恼&#xff0c;一样的意气轻狂&#xff0c;一样的洒满阳光的日子。 好消息是可能老铁要过来发展&#xff0c;期待&#…

SWMM模型INP解析

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

《开始使用PyQT》 第01章 PyQT入门 01 PyQT框架概述

01 PyQT框架概述 《开始使用PyQT》 第01章 PyQT入门 01 PyQT框架概述 The PyQt toolkit is a set of Python bindings for the Qt cross-platform widget toolkit and application framework. What does that mean? PyQt 工具包是 Qt 跨平台 widget 工具包和应用程序框架的…

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

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

设置模式之责任链模式

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

C++-gdb调试常用功能

文章目录 启动gdb运行程序设置断点运行控制查看源码查看信息查看变量线程相关 gdb调试常用功能如下&#xff0c;其中bin为要调试的程序&#xff0c;arg为参数 启动gdb 启动调试 gdb bin带参数启动 gdb --args bin arg1 arg2so预加载LD_PRELOAD/path/to/lib.so && gdb …

图像处理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…

Vue学习笔记12--Vue3之setup/ref函数/reactive函数/Vue3响应式原理/reactive对比ref

一、拉开序幕的setup 理解&#xff1a;Vue3中一个新的配置项&#xff0c;值为一个函数。setup是所有Composition API(组合API&#xff09;表演的舞台。组件中所用到的&#xff1a;数据、方法等&#xff0c;均要配置在setup中。setup函数的两种返回值&#xff1a; 若返回一个对…

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

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

数据结构进阶:二叉搜索树

1、二叉搜索树的实现 二叉搜索树的拥有很快的查找速度&#xff0c;查找的效率为O&#xff08;logN)&#xff0c;也就是说如果把全国的人放到二叉搜索树中&#xff0c;最多只需要31次就可以 找到你&#xff0c;这是一种很快的搜索方式&#xff0c;他还有两种模型一种是key模型&a…

蓝桥杯准备之路-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…