Rust 的 Error 如何使用?
在 Rust 中,错误处理是一个重要且核心的概念。Rust 提供了一种强大的类型系统,允许你明确地处理可能出现的错误。std::error::Error trait 是 Rust 标准库中用于表示错误的基础 trait。实现这个 trait 的类型可以被用作错误类型,并且可以使用 std::fmt::Display trait 来提供错误的描述信息。
以下是如何在 Rust 中使用错误处理的一些基本步骤和最佳实践:
1. 自定义错误类型
首先,你可以通过实现 std::error::Error trait 来创建自定义错误类型。
use std::error::Error;
use std::fmt; #[derive(Debug)]
struct MyCustomError { description: String,
} impl Error for MyCustomError {} impl fmt::Display for MyCustomError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.description) }
}
2. 使用 Result<T, E>
在 Rust 中,函数可以通过返回 Result<T, E> 来表示操作的成功或失败,其中 T 是成功时返回的类型,E 是错误类型。
use std::io; fn read_file(filename: &str) -> Result<String, MyCustomError> { let mut file = match std::fs::File::open(filename) { Ok(file) => file, Err(e) => return Err(MyCustomError { description: e.to_string() }), }; let mut contents = String::new(); match file.read_to_string(&mut contents) { Ok(_) => Ok(contents), Err(e) => Err(MyCustomError { description: e.to_string() }), }
}
3. 使用 ? 运算符处理错误
在 Rust 中,? 运算符可以简化错误处理。如果 Result 值是 Err,则 ? 会立即从当前函数返回该错误。
use std::fs::File;
use std::io::Read; fn read_file(filename: &str) -> Result<String, MyCustomError> { let mut file = File::open(filename)?; let mut contents = String::new(); file.read_to_string(&mut contents)?; Ok(contents)
}
4. 处理错误
调用返回 Result 的函数时,你需要处理可能发生的错误。这通常通过 match 表达式或 if let 表达式完成。
fn main() { let filename = "example.txt"; match read_file(filename) { Ok(contents) => println!("File contents: {}", contents), Err(e) => println!("Error reading file: {}", e), }
}
或者,你可以使用 try! 宏(在旧版本的 Rust 中)或 ? 运算符在 main 函数或其他返回 Result 的函数中传播错误。
fn main() -> Result<(), MyCustomError> { let filename = "example.txt"; let contents = read_file(filename)?; println!("File contents: {}", contents); Ok(())
}
5. 组合错误
有时,你可能希望将多个可能出错的操作组合起来,并将它们的错误以某种方式合并。你可以使用 try 块和 ? 运算符,或者使用像 std::error::Error trait 的实现 anyhow 或 thiserror 这样的库来更容易地组合和处理错误。
总结
Rust 的错误处理是强大且灵活的,允许你以明确和可预测的方式处理程序中可能出现的失败情况。通过实现自定义错误类型、使用 Result<T, E>、? 运算符以及适当地处理错误,你可以编写出健壮且易于维护的 Rust 代码。
相关文章:
Rust 的 Error 如何使用?
在 Rust 中,错误处理是一个重要且核心的概念。Rust 提供了一种强大的类型系统,允许你明确地处理可能出现的错误。std::error::Error trait 是 Rust 标准库中用于表示错误的基础 trait。实现这个 trait 的类型可以被用作错误类型,并且可以使用…...
Hack The Box-Crafty
目录 信息收集 rustscan whatweb WEB 漏洞利用 漏洞说明 漏洞验证 提权 get user.txt get Administrator 总结 信息收集 rustscan ┌──(root㉿ru)-[~/kali/hackthebox] └─# rustscan -a 10.10.11.249 --range0-65535 --ulimit5000 -- -A -sC [~] Automatically…...
高电平复位电路工作原理详解
单片机复位电路的作用是:使单片机恢复到起始状态,让单片机的程序从头开始执行,运行时钟处于稳定状态、各种寄存器、端口处于初始化状态等等。目的是让单片机能够稳定、正确的从头开始执行程序。一共分为:高电平复位,低…...
了AI而强行AI的做法,构成了人与AI对抗的宿命论
从 ChatGPT到文生图的 Stable Diffusion,再到文生视频的 Sora ,每次大语言模型的迭代,以及由此衍生的新产品,都让各行各业的企业主、从业者们,感到无所适从。 普通人可以借助AI的力量“逆天改命”吗? 10多…...
【性能测试】Jmeter+InfluxDB+Grafana 搭建性能监控平台
一、背景 为什么要搭建性能监控平台? 在用 Jmeter 获取性能测试结果的时候,Jmeter自带的测试报告如下: 这个报告有几个很明显的缺点: 只能自己看,无法实时共享;报告信息的展示比较简陋单一,不…...
【YOLOv8模型网络结构图理解】
YOLOv8模型网络结构图理解 1 YOLOv8的yaml配置文件2 YOLOv8网络结构2.1 Conv2.2 C3与C2f2.3 SPPF2.4 Upsample2.5 Detect层 1 YOLOv8的yaml配置文件 YOLOv8的配置文件定义了模型的关键参数和结构,包括类别数、模型尺寸、骨干(backbone)和头部…...
付强:基于注意力机制的听觉前端处理 | 嘉宾公布
一、智能家居与会议系统专题论坛 智能家居与会议系统专题论坛将于3月28日同期举办! 智能会议系统它通过先进的技术手段,提高了会议效率,降低了沟通成本,提升了参会者的会议体验。对于现代企业、政府机构和学术界是不可或缺的。在这…...
C++_包装器
目录 1、包装器的用法 2、包装器的类型 3、包装器的作用 4、包装成员函数 5、bind(绑定) 5.1 bind的用法 5.2 bind减少参数个数 结语 前言: C11的包装器,总称为function包装器,而包装器又称适配器…...
3588板子部署yoloV5
一 :准备 ubuntu linux X86_64系统 a.安装anaconda b.创建虚拟环境 python3.8 二: 下载rknn-toolkit2 传送门 unzip 解压文件夹 三:pt转onnx模型 四:onnx转rknn模型 a:cd到rknn-toolkit2-master/rknn-toolkit2/packag…...
解决GitHub提交时不显示自己的头像 显示另一个账号(其实也是自己)
git show 看看是否是自己的githup 账号的邮箱 如果不是进行下列操作 git config user.email “你的邮箱地址”,修改邮箱 修改完以后输入git config user.email 检查是否修改成了你的邮箱 如果你想其他项目提交时,也避免此类情况,把上面的两条命令改成 (1&#…...
VUE_vue2/3点击区域外触发方法,点击除某个元素触发监听
Vue2 1、自定义指令 // 自定义指令,用于处理点击外部区域的事件 const clickOutside {bind(el, binding) {// 在元素上绑定一个点击事件监听器el.clickOutsideEvent function (event) {// 检查点击事件是否发生在元素的内部if (!(el event.target || el.contai…...
SpringCloud(20)之Skywalking Agent原理剖析
一、Agent原理剖析 使用Skywalking的时候,并没有修改程序中任何一行 Java 代码,这里便使用到了 Java Agent 技术,我 们接下来展开对Java Agent 技术的学习。 1.1 Java Agent Java Agent 是从 JDK1.5 开始引入的,算是一个比较老的…...
容器(0)-DOCKERFILE-安装-常用命令-部署-迁移备份-仓库
1.安装 启动 systemclt start docker //启动 systemctl status docker //状态 docker info systemclt stop docker systemctl status docker systemctl enable docker //开机启动 2.常用命令 镜像查看 docker images 镜像查看 docker status 镜像拉取 docker pull centos:…...
低功耗DC-DC电压调整器IU5528D
IU5528D是一款超微小型,超低功耗,高效率,升降压一体DC-DC调整器。适用于双节,三节干电池或者单节锂电池的应用场景。可以有效的延长电池的使用时间。IU5528D由电流模PWM控制环路,误差放大器,比较器和功率开关等模块组成。该芯片可在较宽负载范围内高效稳…...
【备战蓝桥杯系列】单源最短路径Dijkstra算法模板
Dijkstra算法模板 蓝桥杯中也是会考到图论最短路的,一旦考到,基本是不会太难的,只要知道板子就基本能拿分了。 两个板子如下 朴素Dijkstra算法 适应情况:稠密图,正权边 时间复杂度 O(n^2 m) int dijkst(){memse…...
嵌入式系统中端口号的理解与分析
每当看到有人的简历上写着熟悉 tcp/ip, http 等协议时, 我就忍不住问问他们: 你给我说说, 端口是啥吧! 可惜, 很少有人能说得让人满意... 所以这次就来谈谈端口(port), 这个熟悉的陌生人. 在此过程中, 还会谈谈间接层, naming service 等概念, IoC, 依赖倒置等原则以及 TCP 协议…...
3.自定义工程目录配置CMakeLists
问题背景 熟悉stm32keil开发的都知道,我们在编写不同的外设时,通常都会单独编写一个app文件夹或者是user文件夹之类的来存放不同外设功能的源文件和头文件。 在前面一节2.构建第一个工程并烧录到ESP32开发板-CSDN博客中,我们是使用了一个乐鑫…...
Vue3.0里为什么要用 Proxy API 替代 defineProperty API
一、Object.defineProperty 定义:Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象 为什么能实现响应式 通过defineProperty 两个属性,get及set get 属性的 getter 函…...
c++初阶------类和对象(下)
作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂 🎉🎉🎉…...
PMP考试:如何高效学习PMBOK?
PMBOK(项目管理知识体系指南)是PMP考试的核心教材,学习PMBOK对于备考PMP考试至关重要。那么我将分享一些高效学习PMBOK的方法和技巧,帮助同学们更好地掌握项目管理知识。 一、制定学习计划 在学习PMBOK之前,制定一个详…...
Lychee-Rerank参数详解:instruction模板设计技巧(含法律/医疗/金融领域示例)
Lychee-Rerank参数详解:instruction模板设计技巧(含法律/医疗/金融领域示例) 1. 工具核心原理与价值 Lychee-Rerank是一个基于Qwen2.5-1.5B模型的本地检索相关性评分工具,专门用于评估查询语句与文档内容之间的匹配程度。与云端…...
交叉编译程序,在armv7l架构的开发板上运行
手头有块开发板,需要基于它做二次开发。 开发板是ARM架构的CPU,当前跑的Linux,内核是4.X。 想在安装在virtualbox上的Linux(安装的是kali Linux)上开发程序, 然后交叉编译后上传到开发板上。 一、确定开发板…...
突破硬件限制的开源游戏串流方案:Sunshine跨设备游戏体验指南
突破硬件限制的开源游戏串流方案:Sunshine跨设备游戏体验指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 当你拥有一台高性能游戏PC,却只能在固定位置享…...
如何利用Bebas Neue字体提升设计项目的视觉冲击力:完整实战指南
如何利用Bebas Neue字体提升设计项目的视觉冲击力:完整实战指南 【免费下载链接】Bebas-Neue Bebas Neue font 项目地址: https://gitcode.com/gh_mirrors/be/Bebas-Neue 你是否曾经在设计海报、网站标题或品牌标识时,为了找到一款既有现代感又足…...
如何快速下载网络视频:VideoDownloadHelper终极使用指南
如何快速下载网络视频:VideoDownloadHelper终极使用指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾为无法下载在线视…...
3分钟快速上手:免费城通网盘解析器终极指南
3分钟快速上手:免费城通网盘解析器终极指南 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 还在为城通网盘下载慢、广告多而烦恼吗?城通网盘解析器正是解决这些问题的利器&#…...
OpenClaw+千问3.5-27B开发提效:日志分析+异常自动上报
OpenClaw千问3.5-27B开发提效:日志分析异常自动上报 1. 为什么需要自动化日志分析 作为一个长期与代码打交道的开发者,我每天至少有30%的时间花在查看日志、定位问题上。特别是在调试分布式系统时,不同服务的日志分散在各个文件,…...
5分钟掌握Switch破解神器TegraRcmGUI:新手也能轻松上手的图形化注入教程
5分钟掌握Switch破解神器TegraRcmGUI:新手也能轻松上手的图形化注入教程 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI 还在为Switch破解的复杂…...
IC版图新手避坑:用Layout XL做Floorplan时,关闭飞线的正确姿势与常见误区
IC版图设计实战:Layout XL飞线管理的艺术与科学 在IC版图设计的世界里,飞线(Rubber Band)就像一把双刃剑——它既是连接关系的直观体现,也可能成为视觉干扰的源头。特别是当设计规模达到数万甚至数十万门级时ÿ…...
解决中文文献管理痛点:茉莉花插件如何提升学术研究效率
解决中文文献管理痛点:茉莉花插件如何提升学术研究效率 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 副标题&#x…...
