std::error::Error 和 std::io::Error 的区别和用法
std::error::Error 和 std::io::Error 在 Rust 中都是用于错误处理的类型,但它们各自有不同的用途和场景。
- std::error::Error:
std::error::Error 是一个 trait,它定义了错误处理的基本接口。这个 trait 通常由其他具体的错误类型实现,以提供错误信息的描述、原因链等。在 Rust 中,当你需要定义自己的错误类型时,实现 Error trait 是一种常见的做法。通过实现 Error trait,你的自定义错误类型可以与 Rust 的错误处理机制集成,例如通过 try! 宏或 ? 操作符进行错误传播。
例如,你可以定义一个包含错误消息和可选内部错误的自定义错误类型,并实现 Error trait 如下:
use std::error::Error;
use std::fmt;
use std::option::Option;
use std::boxed::Box;#[derive(Debug)]
struct MyCustomError {message: String,inner_error: Option<Box<dyn Error>>,
}impl Error for MyCustomError {fn description(&self) -> &str {&self.message}fn cause(&self) -> Option<&dyn Error> {self.inner_error.as_deref()}
}impl fmt::Display for MyCustomError {fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {write!(f, "{}", self.message)}
}
- std::io::Error:
std::io::Error 是 Rust 标准库中定义的一个具体的错误类型,用于表示 I/O 操作中的错误。它实现了 Error trait,因此你可以像处理其他实现了 Error trait 的类型一样处理 std::io::Error。
std::io::Error 提供了一种统一的方式来处理各种 I/O 错误情况,例如文件读写错误、网络操作错误等。你可以使用 std::io::Error 的方法和属性来获取关于错误的详细信息,例如错误类型、错误消息以及可能的错误原因链。
例如,当你执行文件读写操作时,如果发生错误,函数通常会返回一个 Result<T, std::io::Error>,其中 T 是操作成功时的返回值类型。你可以使用 match 表达式或 ? 操作符来处理这个 Result,并根据需要处理 std::io::Error。
use std::fs::File;
use std::io::Read;
use std::io::Error;fn read_file(filename: &str) -> Result<String, Error> {let mut file = File::open(filename)?;let mut contents = String::new();file.read_to_string(&mut contents)?;Ok(contents)
}
在这个例子中,如果文件打开失败或读取失败,? 操作符会将 std::io::Error 传播给调用者。调用者可以根据需要处理这个错误,例如打印错误消息或进行错误恢复。
总结来说,std::error::Error 是一个 trait,用于定义错误处理的接口,而 std::io::Error 是实现了这个 trait 的一个具体错误类型,用于表示 I/O 操作中的错误。在编写 Rust 代码时,你可以根据需要使用它们来处理错误情况。
相关文章:
std::error::Error 和 std::io::Error 的区别和用法
std::error::Error 和 std::io::Error 在 Rust 中都是用于错误处理的类型,但它们各自有不同的用途和场景。 std::error::Error: std::error::Error 是一个 trait,它定义了错误处理的基本接口。这个 trait 通常由其他具体的错误类型实现&…...
16 OpenCV Laplance算子
文章目录 图像的二阶导数Laplance算子代码示例 图像的二阶导数 在二阶导数的时候,最大变化处的值为零即边缘是零值。通过二阶 导数计算,依据此理论我们可以计算图像二阶导数,提取边缘。 Laplance算子 void Laplacian( InputArray src, Output…...
hardhat学习笔记
hardhat学习笔记会不定时填充内容。 初始化项目 yarn init 安装hardhat依赖 yarn add --dev hardhat 初始化 Hardhat yarn hardhat 代码格式化 yarn add --dev prettier prettier-plugin-solidity 项目中增加.prettierrc 与 .prettierignore 配置文件统一格式࿰…...
算法刷题day28
目录 引言一、截断数组二、双端队列三、日期统计 引言 这几道题是周赛里的几道题目,第一道题目我没用这种方法,但还是做出来了,用的一种比较特殊的思考方法,就是把每一个点都判断出来,不满足要求的就舍弃,…...
vivado 使用Design Runs窗口、
使用Design Runs窗口 “设计运行”窗口显示在项目中创建的所有合成和实现运行。它包括用于配置、管理和启动运行的命令。 打开Design Run窗口 选择窗口 → Design Runs打开“Design Runs”窗口。 设计运行窗口功能 •每个实现运行都缩进显示在其子级的合成运行下面。 …...
基于YOLOv8的手机摄像头的自动检测系统
文章大纲 数据集网络爬虫开源数据集标注目标定义标注标准标注工具标签更换脚本自制数据集下载地址自动检测系统设计与搭建模型训练与准确率代码仓库下载地址参考文献与学习路径随着移动通信技术的飞速发展,消费者对移动终端的要求也越来越高,各厂商纷纷提出自己的特色卖点,其…...
Ubuntu18.04添加内核模块(字符设备)
Ubuntu18.04添加内核模块(字符设备) 虚拟机Ubuntu18.04(内核版本linux-5.4.0-135-generic) 参考 嵌入式Linux驱动开发(一)——字符设备驱动框架入门 1 编译内核模块 创建字符设备代码文件char_dev.c&a…...
PromptBreeder---针对特定领域演化和发展提示词的方法
原文地址:promptbreeder-evolves-adapts-prompts-for-a-given-domain 论文地址:https://arxiv.org/pdf/2309.16797.pdf 2023 年 10 月 6 日 提示方法分为两大类 硬提示是由人工精心设计的文本提示,包含离散的输入令牌;其缺点…...
Java后端八股文之Redis
文章目录 1. Redis是什么?2. Redis为什么这么快?3. 为什么要使用缓存?4. Redis几种使用场景:5. Redis的Zset底层为什么要使用跳表而不是平衡树、红黑树或者B树?6.Redis持久化6.1 什么是RDB持久化6.1.1RDB创建快照会阻塞…...
一维数组_与指定数相同的数的个数
任务描述 输出一个整数序列中与指定数字相同的数的个数。 输入格式: 第一行为N,表示整数序列的长度(N < 100); 第二行为N个整数,整数之间以一个空格分开; 第三行包含一个整数,为指定的整数m。输出格式: 输出为N…...
如何在Linux系统安装SVN并配置固定公网地址远程访问【内网穿透】
文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…...
获取webshell的十种方法
一、直接上传获取webshell 这种对php和jsp的一些程序比较常见,MolyX BOARD就是其中一例,直接在心情图标管理上传。php类型,虽然没有提示,其实已经成功了,上传的文 件url应该是http://forums/images/smiles/下…...
项目实战-tpshop商城项目
项目实战-tpshop商城项目 环境部署准备软件工具准备远程连接测试远程连接测试-查看虚拟机IP地址远程连接测试-检测本机与虚拟机是否连通远程连接测试-通过远程工具连接linux服务器 常见问题处理 环境部署项目技术架构介绍部署tpshop项目-tpshop验证数据库验证用户信息表熟悉商品…...
网络地址转换协议NAT
网络地址转换协议NAT NAT的定义 NAT(Network Address Translation,网络地址转换)是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因…...
Vue教学18:Element UI进阶组件探索,提升Vue应用的专业性
大家好,欢迎回到我们的Vue教学系列博客!在前十七篇博客中,我们学习了Vue.js的基础知识、安装Node.js与npm、使用Vue Devtools进行调试、Vue实例与生命周期钩子、数据绑定(单向与双向)、计算属性与侦听器、条件渲染和列…...
UE5.1_TimeLine
UE5.1_TimeLine 问题引入:UE的Timeline可以在一个场景下无限制的使用多少次?一个动画流程的Timeline的时间持续怎么算?TimeLine中嵌套Timeline的做法是否是合理的?...
Qt自定义控件
自定义控件 目的:将多个控件或者窗口作为一个整体被多次复用。 操作方式 1.首先进行自定义的ui设计,以及对应的.h和.cpp文件 2.到要使用的UI界面上,从控件库中拖拽一个Widget控件 3.右键点击"提升为" 4.填写自定义实现的类名&…...
nRF52832——串口 UART 和 UARTE 外设应用
nRF52832——串口 UART 和 UARTE 外设应用 UART 和 UARTE 原理UART 功能描述UARTE 功能介绍 应用实例串口打印实例串口输入与回环UART 模式串口中断 UART 和 UARTE 原理 UART 功能描述 串口 UART 也称为通用异步收发器。是各种处理器中常用的通信接口,在 nRF52 芯…...
String 底层为什么使用 final 修饰?
1、典型回答 对于这个问题,Java之父詹姆斯 高斯林(James Gosling) 是这样回答的: I would use an immutable whenever I can 翻译为中文:只要允许,我就会使用不可变对象 而作为普通人的我们来说࿰…...
NIN网络中的网络
是什么 intro LeNet→AlexNet→VGG→NiN→GoogLeNet→ResNetLeNet→AlexNet→VGG 卷积层模块充分抽取空间特征全连接层输出分类结果AlexNet & VGG 改进在于把两个模块加宽 、加深(加宽指增加通道数,那加深呢?(层数增加叭 Ni…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
