当前位置: 首页 > news >正文

Rust-11-错误处理

Rust 将错误分为两大类:可恢复的(recoverable)和 不可恢复的(unrecoverable)错误。对于一个可恢复的错误,比如文件未找到的错误,我们很可能只想向用户报告问题并重试操作。不可恢复的错误总是 bug 出现的征兆,比如试图访问一个超过数组末端的位置,因此我们要立即停止程序。
Rust 的错误处理主要通过 Result 和 Option 类型来实现。Result 类型表示一个操作可能会成功(返回 Ok)或失败(返回 Err),而 Option 类型表示一个值可能存在(Some)或不存在(None)。

一、不可恢复异常

C 语言中,尝试读取数据结构之后的值是未定义行为(undefined behavior)。你会得到任何对应数据结构中这个元素的内存位置的值,甚至是这些内存并不属于这个数据结构的情况。这被称为 缓冲区溢出(buffer overread),并可能会导致安全漏洞,比如攻击者可以像这样操作索引来读取储存在数据结构之后不被允许的数据。为了保护程序远离这类漏洞,如果尝试读取一个索引不存在的元素,Rust 会停止执行并拒绝继续。

fn main() {let v = vec![1, 2, 3];v[99];
}

运行产生异常

thread 'main' panicked at src\main.rs:246:6:
index out of bounds: the len is 2 but the index is 99

二、可恢复异常

使用result或者option进行异常处理。

fn divide(a: f64, b: f64) -> Result<f64, String> {if b == 0.0 {Err("除数不能为0".to_string())} else {Ok(a / b)}
}fn main() {let result = divide(10.0, 2.0);match result {Ok(value) => println!("结果: {}", value),Err(err) => println!("错误: {}", err),}
}
fn find_index(vec: &Vec<i32>, target: i32) -> Option<usize> {for (index, &value) in vec.iter().enumerate() {if value == target {return Some(index);}}None
}fn main() {let vec = vec![1, 2, 3, 4, 5];let index = find_index(&vec, 3);match index {Some(value) => println!("找到目标值,索引为: {}", value),None => println!("未找到目标值"),}
}

match已经可以判断是否异常,但是比较长,还有是通过unwarp的方式,如果result的值是Ok,那么会返回结果,如果是Err,unwrap会调用panic!

use std::fs::File;
fn main() {let greeting_file = File::open("hello.txt").unwrap();
}

产生异常时

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Os {
code: 2, kind: NotFound, message: "No such file or directory" }',
src/main.rs:4:49

也可以通过expect方法去自定义异常输出。

三、错误的传播

从一个方法里面抛出了错误,外层调用的方法怎么捕获异常,类似java的throw try catch

fn read_username_from_file() -> Result<String, io::Error> {let username_file_result = File::open("hello.txt");let mut username_file = match username_file_result {Ok(file) => file,Err(e) => return Err(e),};let mut username = String::new();match username_file.read_to_string(&mut username) {Ok(_) => Ok(username),Err(e) => Err(e),}
}

也可以使用简写: ? 运算符

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)
}

还可以进一步缩短

use std::fs::File;
use std::io::{self, Read};
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)
}

哪里可以使用 ? 运算符
? 运算符只能被用于返回值与 ? 作用的值相兼容的函数。因为 ? 运算符被定义为从函数中提早返回一个值,这与上面写的 match 表达式有着完全相同的工作方式。

相关文章:

Rust-11-错误处理

Rust 将错误分为两大类&#xff1a;可恢复的&#xff08;recoverable&#xff09;和 不可恢复的&#xff08;unrecoverable&#xff09;错误。对于一个可恢复的错误&#xff0c;比如文件未找到的错误&#xff0c;我们很可能只想向用户报告问题并重试操作。不可恢复的错误总是 b…...

自动化测试:使用Postman进行接口测试与脚本编写

Postman 是一种流行的 API 测试工具&#xff0c;广泛应用于开发和测试过程中。它不仅可以用于手动测试&#xff0c;还支持自动化测试和脚本编写&#xff0c;以确保 API 的可靠性和性能。本文将详细介绍如何使用 Postman 进行接口测试与脚本编写&#xff0c;帮助你更高效地进行自…...

ONLYOFFICE 8.1 桌面编辑器测评:引领数字化办公新潮流

目录 前言 下载安装 新功能概述 1.PDF 编辑器的改进 2. 演示文稿中的幻灯片版式 3.语言支持的改进 4. 隐藏“连接到云”板块 5. 页面颜色设置和配色方案 界面设计&#xff1a;简洁大方&#xff0c;操作便捷 性能评测&#xff1a;稳定流畅&#xff0c;高效运行 办公环…...

基于大语言模型LangChain框架:知识库问答系统实践

ChatGPT 所取得的巨大成功&#xff0c;使得越来越多的开发者希望利用 OpenAI 提供的 API 或私有化模型开发基于大语言模型的应用程序。然而&#xff0c;即使大语言模型的调用相对简单&#xff0c;仍需要完成大量的定制开发工作&#xff0c;包括 API 集成、交互逻辑、数据存储等…...

解锁Transformer的鲁棒性:深入分析与实践指南

&#x1f6e1;️ 解锁Transformer的鲁棒性&#xff1a;深入分析与实践指南 Transformer模型自从由Vaswani等人在2017年提出以来&#xff0c;已经成为自然语言处理&#xff08;NLP&#xff09;领域的明星模型。然而&#xff0c;模型的鲁棒性——即模型在面对异常、恶意或不寻常…...

mybatis#号和$区别

在MyBatis中&#xff0c;#{}和${}都是用于实现动态SQL的占位符&#xff0c;但它们在使用场景和安全性上有明显的区别&#xff1a; 用途区别&#xff1a; #{}主要用于传递接口传输过来的具体数据&#xff0c;如参数值&#xff0c;它可以防止SQL注入&#xff0c;因为MyBatis会…...

AI绘画 Stable Diffusion【实战进阶】:图片的创成式填充,竖图秒变横屏壁纸!想怎么扩就怎么扩!

大家好&#xff0c;我是向阳。 所谓图片的创成式填充&#xff0c;就是基于原有图片进行扩展或延展&#xff0c;在保证图片合理性的同时实现与原图片的高度契合。是目前图像处理中常见应用之一。之前大部分都是通过PS工具来处理的。今天我们来看看在AI绘画工具 Stable Diffusio…...

Linux内核 -- 汇编结合ko案例之PMU获取cpu cycle技术

ARMv7汇编实现周期计数读取与清空 本文档详细描述了如何在ARMv7平台上使用汇编语言编写周期计数器读取与清空函数&#xff0c;如何在内核模块中导出这些函数供其他模块调用&#xff0c;以及如何使用Netlink接口供用户态程序进行调用。 1. 汇编函数实现 首先&#xff0c;编写…...

探索 Symfony 框架:工作原理、特点及技术选型

目录 1. 概述 2. Symfony 的工作原理 2.1 MVC 架构 2.2 前端控制器模式 2.3 路由机制 2.4 依赖注入容器 2.5 事件驱动架构 3. Symfony 的特点 3.1 高度可扩展性 3.2 强大的社区支持和生态系统 3.3 优秀的性能和可伸缩性 3.4 严格的代码规范和最佳实践 4. Symfony …...

从万里长城防御体系看软件安全体系建设@安全历史03

长城&#xff0c;是中华民族的一张重要名片&#xff0c;是中华民族坚韧不屈、自强不息的精神象征&#xff0c;被联合国教科文组织列入世界文化遗产名录。那么在古代&#xff0c;长城是如何以其复杂的防御体系&#xff0c;一次次抵御外族入侵&#xff0c;而这些防御体系又能给软…...

ISO 19110操作要求类中的/req/operation/formal-definition详细解释

/req/operation/formal-definition 要求: 每个要素操作实体必须具有一个形式定义&#xff08;formal definition&#xff09;&#xff0c;该定义应明确描述操作的行为和影响。 具体解释 定义 要素操作实体&#xff08;feature operation entity&#xff09;&#xff1a;这…...

豆包大语言模型API调用错误码一览表

本文介绍了您可能从 API 和官方 SDK 中看到的错误代码。 http code说明 400 原因&#xff1a;错误的请求&#xff0c;例如缺少必要参数&#xff0c;或者参数不符合规范等 解决方法&#xff1a;检查请求后重试 401 原因&#xff1a;认证错误&#xff0c;代表服务无法对请求进…...

AI辅助设计:如何通过机器学习革新创意工作流程

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法&#xff0c;大数据&#xff0c;深度学习 &#x1f492; 公众号…...

轻松解锁电脑强悍性能,4000MHz的玖合星舞 DDR4 内存很能打

轻松解锁电脑强悍性能&#xff0c;4000MHz的玖合星舞 DDR4 内存很能打 哈喽小伙伴们好&#xff0c;我是Stark-C~ 很多有经验的电脑玩家在自己DIY电脑选购内存条的时候&#xff0c;除了内存总容量&#xff0c;最看重的参数那就是频率了。内存频率和我们常说的CPU主频一样&…...

SpringBoot | 使用jwt令牌实现登录认证,使用Md5加密实现注册

对于登录认证中的令牌&#xff0c;其实就是一段字符串&#xff0c;那为什么要那么麻烦去用jwt令牌&#xff1f;其实对于登录这个业务&#xff0c;在平常我们实现这个功能时&#xff0c;可能大部分都是通过比对用户名和密码&#xff0c;只要正确&#xff0c;就登录成功&#xff…...

Springboot基于Redis的高性能分布式缓存数据库的实现与实例

一、引言 在现代的分布式系统和高并发应用中&#xff0c;缓存机制显得尤为重要。Redis作为一种开源&#xff08;BSD许可&#xff09;的内存键值存储&#xff0c;因其高性能、丰富的数据结构和多样化的应用场景&#xff0c;成为开发者们的首选。在这篇博客中&#xff0c;我们将…...

防止多次点击,vue的按钮上做简易的防抖节流处理

话不多说,上个视频,看看是不是你要的效果 防抖节流 1.创建一个directive.js // directive.js export default {install(Vue) {// 防重复点击(指令实现)Vue.directive(repeatClick, {inserted(el, binding) {el.addEventListener(click, () > {if (!el.disabled) {el.disabl…...

云计算【第一阶段(21)】Linux引导过程与服务控制

目录 一、linux操作系统引导过程 1.1、开机自检 1.2、MBR引导 1.3、GRUB菜单 1.4、加载 Linux 内核 1.5、init进程初始化 1.6、简述总结 1.7、初始化进程centos 6和7的区别 二、排除启动类故障 2.1、修复MBR扇区故障 2.1.1、 实验 2.2、修复grub引导故障 2.2.1、实…...

Google 发布最新开放大语言模型 Gemma 2,现已登陆 Hugging Face Hub

Google 发布了最新的开放大语言模型 Gemma 2&#xff0c;我们非常高兴与 Google 合作&#xff0c;确保其在 Hugging Face 生态系统中的最佳集成。你可以在 Hub 上找到 4 个开源模型 (2 个基础模型和 2 个微调模型) 。发布的功能和集成包括&#xff1a; Hub 上的模型https://hf.…...

智能分析赋能等保:大数据技术在安全审计记录中的应用

随着信息技术的飞速发展&#xff0c;大数据技术在各行各业中的应用愈发广泛&#xff0c;特别是在网络安全领域&#xff0c;大数据技术为安全审计记录提供了强有力的支撑。本文将深入探讨智能分析如何赋能等保&#xff08;等级保护&#xff09;&#xff0c;以及大数据技术在安全…...

Claude Code架构深度解析:从核心文件到Harness的确定性控制体系

前言 Claude Code凭借强大的代码理解、编辑与执行能力&#xff0c;成为AI研发工程师的高效工具&#xff0c;但多数使用者仅停留在功能调用层面&#xff0c;对其底层架构尤其是核心控制层Harness知之甚少。作为Claude Code架构师&#xff0c;本文将从项目架构视角&#xff0c;拆…...

告别fdisk!用parted命令轻松管理4TB以上大硬盘(附实战案例)

告别fdisk&#xff01;用parted命令轻松管理4TB以上大硬盘&#xff08;附实战案例&#xff09; 当你的NAS存储阵列需要扩容到8TB&#xff0c;或是数据库服务器要配置12TB的RAID组时&#xff0c;传统的fdisk工具会在第一个指令就给你泼冷水——它根本不认识超过2TB的磁盘空间。这…...

【C++ 面试突击 · 05】大厂高频面试题:从内联函数到内存管理全梳理

目录 一、什么是inline函数&#xff1f; 二、inline函数的优缺点&#xff1f; 三、inline和宏定义的比较&#xff1f; 四、虚函数&#xff08;virtual&#xff09;可以是内联函数&#xff08;inline&#xff09;吗&#xff1f; 五、C中struct和class的区别&#xff1f; 六…...

SensorMonitor:嵌入式传感器智能调度与状态管理框架

1. SensorMonitor 库深度解析&#xff1a;面向嵌入式系统的智能传感器状态管理框架1.1 设计动机与工程痛点在资源受限的嵌入式系统中&#xff0c;尤其是基于 Arduino 架构的物联网终端节点&#xff08;如电池供电的环境监测器、工业现场传感器网关&#xff09;&#xff0c;传感…...

中文AI象年轻小伙与英语AI象老年人:一场算力背后的文明时差

中文AI与英语AI&#xff1a;一场算力背后的文明时差当AI算力的齿轮飞速运转&#xff0c;中文AI与英语AI的差距早已超越“风格不同”&#xff0c;成为算力效率、表达质感与发展潜力的全方位断层——中文AI如意气风发的年轻小伙&#xff0c;灵动通透、反应敏捷&#xff0c;以极低…...

别只玩文生图了!手把手教你用Stable Diffusion 1.4的VAE模型,无损压缩和重构你的本地图片

解锁Stable Diffusion VAE的隐藏技能&#xff1a;从AI绘画到专业图像处理实战 你是否曾为海量图片的存储空间发愁&#xff1f;或是苦恼于传统图像处理工具的繁琐流程&#xff1f;今天&#xff0c;我们将颠覆你对Stable Diffusion的认知——它的VAE模型远不止是AI绘画的配角&…...

SAP PP MRP再计划配置详解:从工厂日历到容差设置,手把手教你避开计划混乱

SAP PP MRP再计划配置实战指南&#xff1a;精准控制生产排程的关键参数 在制造业的日常运营中&#xff0c;生产计划的有效性直接关系到交付准时率和库存周转效率。作为SAP PP模块的核心功能之一&#xff0c;MRP&#xff08;物料需求计划&#xff09;的再计划机制扮演着"计…...

语音增强与跨平台部署:DeepFilterNet全场景技术指南

语音增强与跨平台部署&#xff1a;DeepFilterNet全场景技术指南 【免费下载链接】DeepFilterNet Noise supression using deep filtering 项目地址: https://gitcode.com/GitHub_Trending/de/DeepFilterNet 在远程会议中被背景噪音淹没&#xff1f;多语言语音通信时因音…...

Qwen2.5-VL-Ollama效果对比:vs Qwen2-VL在图表理解与定位精度提升

Qwen2.5-VL-Ollama效果对比&#xff1a;vs Qwen2-VL在图表理解与定位精度提升 1. 引言&#xff1a;从Qwen2-VL到Qwen2.5-VL的进化 如果你之前用过Qwen2-VL&#xff0c;可能会觉得它已经很强了——能看懂图片&#xff0c;能回答问题&#xff0c;基本的多模态任务都能搞定。但用…...

SkyWalking TTL配置实战:如何精准控制监控数据生命周期

1. 理解SkyWalking TTL的核心价值 当你的微服务集群每天产生TB级监控数据时&#xff0c;存储成本会像野马一样失控。去年我们一个电商项目就遇到过这样的困境——仅仅三个月ES集群就撑爆了200TB磁盘空间&#xff0c;而排查问题时发现99%的监控数据其实早已失效。这正是TTL&…...