【05】RUST错误处理
文章目录
- 错误处理
- panic
- 代码
- 运行
- Resut
- Result中的一些方法介绍
- 传播错误
- `?`运算符
错误处理
建议是尽量用Result由调用者自行决定是否恢复,不恢复也可直接在Err中调用panic。代码分支不可能走的分支可panic。
需要panic的情况:
- 有害状态:当一些假设、保证、协议或不可变性被打破的状态,例如无效的值、自相矛盾的值或者被传递了不存在
的值 - 非预期行为,比如:不应该走的分支,不遵循契约(contracts)的函数输入
- 后续可能每一步都需要判断错误
- 没办法处理错误的,比如:调用外部库出现的无法规避的panic
- 实例、代码原型、测试
panic
内存越界问题,运行到此处程序会退出。
- 展开退出(默认)
- 回溯栈并清理函数数据
- 直接终止,需要在
Cargo.toml文件中[profile.release]配置panic = 'abort'- 不清理直接退出
代码
panic!("错误提示信息"); //运行到此处,会提示错误行,打印错误提示信息
运行
可以通过设置环境变量RUST_BACKTRACE为非0值,调用生成的backtrace,让panic打印调用堆栈信息
RUST_BACKTRACE=1 cargo run
Resut
官方的文档是先介绍的Result,但是个人觉得这个放在泛型后才ok。而且其本质就是一个泛型,封装了各种方法来处理Ok与Err的不同分支。貌似没必要单独拉出来。
处理可恢复错误,程序可以继续运行。成功时候返回Ok实例,失败时返回包含错误信息的Err实例。
enum Result<T,E>{Ok(T),Err(E),
}
具体的例子
use std::fs::File;
fn main() {let greeting_file_result = File::open("hello.txt");let greeting_file = match greeting_file_result {Ok(file) => file,Err(error) => panic!("Problem opening the file: {error:?}"),};
}
Result中的一些方法介绍
let greeting_file = File::open("hello.txt").unwrap();
// Ok时,unwrap()返回Ok中的值
// Err时,unwrap()调用panic!let greeting_file = File::open("hello.txt").expect("hello.txt should be included in this project");
// 与unwrap()类似,但是会传递信息给panic!
传播错误
就是把Result结果作为函数返回。
?运算符
可使用?运算符简写,该运算符会调用form并转换错误,无需增加额外代码。
- 返回Ok:程序继续运行
- 当出现Err:Err作为整个函数返回值提前返回
- 只能在函数返回
Result类型时候才能,调用?运算符 - 也可以用于
Option的Some或None分支的简写
use std::fs::File;
use std::io::{self, Read};fn read_username_from_file() -> Result<String, io::Error> {let mut username_file = File::open("hello.txt")?;let mut username = String::new();username_file.read_to_string(&mut username)?;Ok(username)
}
?可以进行链式调用
fn read_username_from_file() -> Result<String, io::Error> {let mut username = String::new();File::open("hello.txt")?.read_to_string(&mut username)?;Ok(username)
}
相关文章:
【05】RUST错误处理
文章目录 错误处理panic代码运行 ResutResult中的一些方法介绍传播错误?运算符 错误处理 建议是尽量用Result由调用者自行决定是否恢复,不恢复也可直接在Err中调用panic。代码分支不可能走的分支可panic。 需要panic的情况: 有害状态&#x…...
[免费]SpringBoot公益众筹爱心捐赠系统【论文+源码+SQL脚本】
大家好,我是老师,看到一个不错的SpringBoot公益众筹爱心捐赠系统,分享下哈。 项目介绍 公益捐助平台的发展背景可以追溯到几十年前,当时人们已经开始通过各种渠道进行公益捐助。随着互联网的普及,本文旨在探讨公益事业…...
算法【动态规划中使用观察优化枚举】
动态规划的问题中,已经写出了记忆化搜索的版本,还要写出严格位置依赖的版本,意义在于不仅可以进行空间压缩优化;关键还在于,很多时候通过进一步观察,可以优化枚举,让时间复杂度更好。优化枚举的…...
ML.Net二元分类
ML.Net二元分类 文章目录 ML.Net二元分类前言项目的创建机器学习模型的创建添加模型选择方案训练环境的选择训练数据的添加训练数据的选择训练数据的格式要预测列的选择模型评估模型的使用总结前言 ML.NET是由Microsoft为.NET开发者平台创建的免费、开源、跨平台的机器学习…...
visutal studio 2022使用qcustomplot基础教程
编译 下载,2.1.1版支持到Qt6.4 。 拷贝qcustomplot.h和qcustomplot.cpp到项目源目录(Qt project)。 在msvc中将它俩加入项目中。 使用Qt6.8,需要修改两处代码: L6779 # if QT_VERSION > QT_VERSION_CHECK(5, 2, …...
本地搭建自己的专属客服之OneApi关联Ollama部署的大模型并创建令牌《下》
这里写目录标题 OneApi1、渠道设置2、令牌创建 配置文件修改修改配置文件docker-compose.yml修改config.json到此结束 上文讲了如何本地docker部署fastGtp,相信大家也都已经部署成功了!!! 今天就说说怎么让他们连接在一起 创建你的…...
c#自动更新-源码
软件维护与升级 修复漏洞和缺陷:软件在使用过程中可能会发现各种漏洞和缺陷,自动更新可以及时推送修复程序,增强软件的稳定性和安全性,避免因漏洞被利用而导致数据泄露、系统崩溃等问题。提升性能:通过自动更新&#x…...
SIP中常见的服务器类型
在SIP(Session Initiation Protocol)网络中,除了B2BUA(Back-to-Back User Agent)、路由代理和媒体服务器外,还有其他类型的服务器。以下是所有类型的服务器及其作用、示例和其他相关信息的表格:…...
【C】初阶数据结构4 -- 双向循环链表
之前学习的单链表相比于顺序表来说,就是其头插和头删的时间复杂度很低,仅为O(1) 且无需扩容;但是对于尾插和尾删来说,由于其需要从首节点开始遍历找到尾节点,所以其复杂度为O(n)。那么有没有一种结构是能使得头插和头删…...
小爱音箱控制手机和电视听歌的尝试
最近买了小爱音箱pro,老婆让我扔了,吃灰多年的旧音箱。当然舍不得,比小爱还贵,刚好还有一台红米手机,能插音箱,为了让音箱更加灵活,买了个2元的蓝牙接收模块Type-c供电3.5接口。这就是本次尝试起…...
Kotlin Lambda
Kotlin Lambda 在探索Kotlin Lambda之前,我们先回顾下Java中的Lambda表达式,Java 的 Lambda 表达式是 Java 8 引入的一项强大的功能,它使得函数式编程风格的代码更加简洁和易于理解。Lambda 表达式允许你以一种更简洁的方式表示实现接口&…...
动态库与静态库:深入解析与应用
在软件开发中,库(Library)是预编译的代码集合,用于在多个程序之间共享功能。根据链接方式的不同,库主要分为两种类型:静态库(Static Library) 和 动态库(Dynamic Library…...
List对象进行排序
目录 一、List对象中某个值进行排序 代码示例 注意事项 二、List.sort 和 Collections.sort 异同 1. 方法所属 2. 使用方式 3. 是否修改原列表 4. 泛型支持 5. 性能 6. 适用场景 7. 示例代码对比 使用 testList.sort 使用 Collections.sort 8. 总结 三、为对象多…...
Java 设计模式之备忘录模式
文章目录 Java 设计模式之备忘录模式概述UML代码实现 Java 设计模式之备忘录模式 概述 备忘录(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。方便对该对象恢复到原先保存的状态。 UML Originnato…...
vue3搭建实战项目笔记二
vue3搭建实战项目笔记二 2.1.git管理项目2.2.隐藏tabBar栏2.2.1 方案一:在路由元信息中设置一个参数是否显示tabBar2.2.2 方案二:通过全局设置相对定位样式 2.3.项目里封装axios2.3.1 发送网络请求的两种做法2.3.2 封装axios并发送网络请求2.3.2.1 对axi…...
【原创】解决vue-element-plus-admin无法实现下拉框动态控制表单功能,动态显隐输入框
前言 目前使用vue-element-plus-admin想要做一个系统定时任务功能,可以选择不同的定时任务类型,比如使用cron表达式、周期执行、指定时间执行等。每种类型对应不同的输入框,需要动态显隐输入框才行,但是这个vue-element-plus-adm…...
大疆无人机需要的kml文件如何制作kml导出(大疆KML文件)
大疆无人机需要的轨迹kml文件,是一种专门的格式,这个kml里面只有轨迹点,其它的属性信息都不需要。 BigemapPro提供了专门的大疆格式输出, 软件这里下载 www.bigemap.com 安装后,kml导入如下图: 然后选择…...
前端知识速记--css篇:CSS3中的常见动画及实现方式
前端知识速记–css篇:CSS3中的常见动画及实现方式 常见的CSS3动画 1. 过渡 (Transitions) 过渡是一种非常简单的动画效果,允许你在元素的状态变更时平滑过渡到新状态。 语法格式: transition: property duration timing-function delay;…...
YOLOV8的学习记录(二) yolo8的几个内置模型简介
YOLOv8 是一个多功能的计算机视觉框架,支持多种任务,包括分类(Classify)、检测(Detect)、旋转目标检测(OBB)、姿态估计(Pose)、实例分割(Segment&…...
免费deepseek的API获取教程及将API接入word或WPS中
免费deepseek的API获取教程: 1 https://cloud.siliconflow.cn/中注册时填写邀请码:GAejkK6X即可获取2000 万 Tokens; 2 按照图中步骤进行操作 将API接入word或WPS中 1 打开一个word,文件-选项-自定义功能区-勾选开发工具-左侧的信任中心-信任中心设置…...
Windows操作系统部署Tomcat详细讲解
Tomcat是一个开源的Java Servlet容器,用于处理Java Web应用程序的请求和响应。以下是关于Tomcat的用法大全: 一、安装Tomcat 下载 访问Apache Tomcat官方网站(https://tomcat.apache.org/),根据你的操作系统…...
深入解析A2DP v1.4协议:蓝牙高质量音频传输的技术与实现
1. A2DP概述 A2DP(Advanced Audio Distribution Profile)是一种高质量音频流媒体协议,旨在实现高质量音频内容的分发,通常用于通过蓝牙设备传输音频数据,例如将音乐从便携式播放器传输到耳机或扬声器。与传统的蓝牙语…...
(三)Axure制作转动的唱片
效果图 属性: 图标库:iconfont-阿里巴巴矢量图标库 方形图片转为圆角图片,裁剪,然后加圆角, 唱片和底图是两个图片,点击播放,唱片在旋转。 主要是播放按钮和停止按钮,两个动态面板…...
VueRouter 实例
分析下列代码 const router new VueRouter({mode:history,routes }) 1.const router new VueRouter({ ... })用来创建一个 Vue Router 实例,用于管理 Vue.js 应用的路由。2.mode: history: 作用:启用 HTML5 History 模式,去除…...
Docker 镜像标签使用
写在前面 当使用命令 docker pull mysql 拉取镜像时,其实等价于如下命令 docker pull mysql:latest latest 是默认的标签,字面上理解为最新版本的镜像,实质上 latest 只是镜像的标签名称,跟具体某个版本号地位一样,…...
ASP.NET Core SixLabors.ImageSharp 位图图像创建和下载
从 MVC 控制器内部创建位图图像并将其发送到浏览器;用 C# 编写并与 Linux 和 Windows 服务器兼容。 使用从 ASP.NET MVC 中的控制器下载任何文件类型File。 此示例创建一个位图 (jpeg) 并将其发送到浏览器。它需要 NuGet 包SixLabors.ImageSharp v1.0.4。 另请参…...
蓝桥杯篇---超声波距离测量频率测量
文章目录 简介第一部分:超声波的简介工作原理1.发射超声波2.接收反射波3.计算时间差4.计算距离 硬件连接1.Trig2.Echo 示例代码代码说明注意事项1.声速2.延时精度3.硬件连接 第二部分:频率测量简介频率测量原理1.信号输入2.计数3.计算频率 硬件连接示例代…...
机器学习所需要的数学知识【01】
总览 导数 行列式 偏导数 概理论 凸优化-梯度下降 kkt条件...
【D2】神经网络初步学习
总结:学习了 PyTorch 中的基本概念和常用功能,张量(Tensor)的操作、自动微分(Autograd)、正向传播、反向传播。通过了解认识LeNet 模型,定义神经网络类,熟悉卷积神经网络的基本结构和…...
变相提高大模型上下文长度-RAG文档压缩-3.优化map-reduce(reranker过滤+社区聚类)
我遇到的业务问题实际上是RAG需要处理很多同一对象的日常报告,不像常识类问题,它的相关Document更多而且更分散,日常报告代表数据库里有很多它的内容,而且对象可能只在段落中的几句话提及到。top-k数量受限于大模型长度࿰…...
