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

Rust错误处理:从灭火器到核按钮的生存指南

开篇:错误处理的生存哲学

在Rust的平行宇宙里,错误分为两种人格:

  • panic! → 核按钮💣(不可恢复,全系统警报)
  • Result → 灭火器🧯(可控制,局部处理)
// 核按钮使用示范(请勿轻易尝试)
fn launch_nukes() {panic!("💥 核弹发射密码错误!"); 
}// 灭火器使用示范
fn fight_fire() -> Result<(), String> {Ok(()) // 一切正常时返回氧气面罩
}

第一章:世界末日按钮(panic!)

1.1 核爆基础操作

场景类比:当图书馆发现致命病毒书

fn check_book_safety(page: usize) {let library = ["📖", "📚", "🦠"];if page >= library.len() {panic!("⚠️ 发现第{}页的病毒书,紧急闭馆!", page);}println!("安全阅读第{}页", page);
}// check_book_safety(3); // 触发世界末日

执行结果

thread 'main' panicked at '⚠️ 发现第3页的病毒书,紧急闭馆!'

生存法则

  • 像处理生化危机一样果断
  • 打印错误信息并立即终止程序
  • 适合不可修复的严重错误

1. 2 自动引爆机制

场景类比:数组越界如同踩到地雷

fn step_on_landmine() {let minefield = [1, 2, 3];println!("正在探测第4个位置...");let _bomb = minefield[3]; // 自动触发panic
}

爆炸现场

thread 'main' panicked at 'index out of bounds: the len is 3 but the index is 3'

生存技巧

  • 编译器是排雷专家
  • 开发时开启调试模式(RUST_BACKTRACE=1)
  • 生产环境避免踩雷

第二章:灭火的艺术(Result)

2.1 消防工具包(Result枚举)

工具组成

  • Ok(T) → 完好的消防栓💦
  • Err(E) → 漏水的软管🚱
fn check_fire_extinguisher(pressure: u32) -> Result<String, String> {if pressure > 50 {Ok("压力正常,可以灭火".to_string())} else {Err("⚠️ 压力不足,需要更换罐体!".to_string())}
}let status = check_fire_extinguisher(30);
println!("灭火器状态:{:?}", status);
// 输出:Err("⚠️ 压力不足,需要更换罐体!")

消防守则

  • 必须处理两种可能情况
  • 使用match进行模式匹配
  • 适用于预期内的错误

2.2 错误传递接力

场景类比:消防队接警流程

fn fire_alarm_system() -> Result<(), String> {let step1 = check_fire_extinguisher(60)?;let step2 = check_sprinkler_system()?;Ok(())
}fn check_sprinkler_system() -> Result<(), String> {// 模拟检查失败Err("🚒 喷淋系统故障,水管漏水!".to_string())
}

报警记录

Err("🚒 喷淋系统故障,水管漏水!")

接力规则

  • ? 运算符是快速传递错误的绿色通道
  • 遇到Err立即返回
  • 函数返回类型必须兼容

第三章:危险走钢丝(unwrap与expect)

3.1 无保护走钢丝(unwrap)

场景类比:不使用安全网的高空作业

let safety_net = "安全网已安装".to_string();
let net_status = Some(safety_net);println!("工人状态:{}", net_status.unwrap()); // 安全作业
// let fall = None.unwrap(); // 空中坠落触发panic

安全提示

  • 仅在确定有值时使用
  • 相当于 “我确信这里不会出错”
  • 生产代码慎用

3.2 带提示的冒险(expect)

场景类比:挂着警告牌的钢丝

let balance_pole = Some("平衡杆");
println!("表演者:{}", balance_pole.expect("⚠️ 平衡杆失踪!"));// let disaster = None.expect("救命啊!"); // 带信息的坠落

坠落报告

thread 'main' panicked at '救命啊!'

安全升级

  • 比unwrap更有信息量
  • 依然属于危险操作
  • 适合快速原型开发

终章:综合灾难演练——太空站紧急处理系统

use std::fs::File;
use std::io::Read;fn main() -> Result<(), String> {// 第一阶段:氧气系统检测let o2_status = check_oxygen_system(80)?;println!("{}", o2_status);// 第二阶段:读取舱压数据let pressure = read_pressure_data("pressure.txt")?;println!("当前舱压:{}千帕", pressure);// 第三阶段:终极安全检查verify_emergency_exits(); // 可能触发panicOk(())
}fn check_oxygen_system(level: u32) -> Result<String, String> {match level {0..=20 => Err("☠️ 氧气严重不足!".into()),21..=50 => Ok("⚠️ 氧气量偏低,建议补充".into()),_ => Ok("✅ 氧气系统正常".into())}
}fn read_pressure_data(path: &str) -> Result<f32, String> {let mut file = File::open(path).map_err(|e| format!("🛸 无法读取压力文件:{}", e))?;let mut content = String::new();file.read_to_string(&mut content).map_err(|e| format!("📉 数据解析失败:{}", e))?;content.trim().parse().map_err(|_| "🔢 舱压数据格式异常".into())
}fn verify_emergency_exits() {let exits_functional = false;assert!(exits_functional, "🚨 紧急出口验证失败!");
}

演练结果分析

情景一:正常流程

✅ 氧气系统正常
当前舱压:101.3千帕
thread 'main' panicked at '🚨 紧急出口验证失败!'

情景二:氧气不足

Err("☠️ 氧气严重不足!")

情景三:压力文件丢失

✅ 氧气系统正常
Err("🛸 无法读取压力文件:No such file or directory")

生存手册精华版

  1. panic! 是最后的逃生舱——只在真正危机时使用
  2. Result 是太空站的冗余系统——优雅处理预期问题
  3. ? 运算符像紧急通道——快速传递问题
  4. unwrap 像不系安全带的太空行走——刺激但危险
  5. assert! 是自动化安检仪——及早发现问题

记住:在Rust的太空站里,错误处理不是可选配件

相关文章:

Rust错误处理:从灭火器到核按钮的生存指南

开篇&#xff1a;错误处理的生存哲学 在Rust的平行宇宙里&#xff0c;错误分为两种人格&#xff1a; panic! → 核按钮&#x1f4a3;&#xff08;不可恢复&#xff0c;全系统警报&#xff09;Result → 灭火器&#x1f9ef;&#xff08;可控制&#xff0c;局部处理&#xff0…...

Golang:Go 1.23 版本新特性介绍

流行的编程语言Go已经发布了1.23版本&#xff0c;带来了许多改进、优化和新特性。在Go 1.22发布六个月后&#xff0c;这次更新增强了工具链、运行时和库&#xff0c;同时保持了向后兼容性。 Go 1.23 的新增特性主要包括语言特性、工具链改进、标准库更新等方面&#xff0c;以下…...

电脑运行黑屏是什么原因?原因及解决方法

电脑运行黑屏是指电脑在正常开机或使用过程中&#xff0c;突然出现屏幕变黑&#xff0c;无法显示任何内容的现象。这种现象可能会给用户带来很多不便&#xff0c;甚至造成数据丢失或硬件损坏。那么&#xff0c;电脑运行黑屏是什么原因呢&#xff1f;下面我们将分析几种可能的原…...

redis之AOF持久化过程

流程图 在redis.conf文件中配置appendonly为yes则开启aof持久化机制 #开启aof持久化&#xff0c;默认关闭为no appendonly no也可以在命令行开启 aof刷盘策略 #每个写操作都会同步刷盘。 appendfsync always #执行命令后先放入aof缓冲区&#xff0c;每秒钟将缓冲区数据刷盘…...

Elasticsearch:向量搜索的快速介绍

作者&#xff1a;来自 Elastic Valentin Crettaz 本文是三篇系列文章中的第一篇&#xff0c;将深入探讨向量搜索&#xff08;也称为语义搜索&#xff09;的复杂性&#xff0c;以及它在 Elasticsearch 中的实现方式。 本文是三篇系列文章中的第一篇&#xff0c;将深入探讨向量搜…...

Docker在安装时遇到的问题(第一部分)

一、在用docker-config-manager安装yum源时出现错误 [rootlocalhost ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 已加载插件&#xff1a;fastestmirror, langpacks adding repo from: https://download.docker.com/linux/ce…...

使用 OpenGL ES 在 iOS 上渲染一个四边形:从基础到实现

使用 OpenGL ES 在 iOS 上渲染一个四边形:从基础到实现 在 iOS 开发中,OpenGL ES 是一个强大的工具,用于实现高性能的 2D 和 3D 图形渲染。本文将详细分析一段完整的代码,展示如何使用 OpenGL ES 在 iOS 上渲染一个简单的四边形。我们将从代码的结构、关键模块、着色器的实…...

Spring Boot 2 快速教程:WebFlux处理流程(五)

WebFlux请求处理流程 下面是spring mvc的请求处理流程 具体步骤&#xff1a; 第一步&#xff1a;发起请求到前端控制器(DispatcherServlet) 第二步&#xff1a;前端控制器请求HandlerMapping查找 Handler &#xff08;可以根据xml配置、注解进行查找&#xff09; 匹配条件包括…...

Vue 鼠标事件合集,关于鼠标右键的处理方法(改写鼠标右键方法、自定义鼠标右键)

鼠标事件使用 mousedown"canvasDown($event)"按下事件合集 click 点击某个对象时触发 mousedown 鼠标按钮被按下时触发 mouseup 鼠标按钮被松开时触发 mouseleave 当鼠标指针移出元素时触发 dblclick 双击时触发 mousemove 鼠标移动时触发&#xff0c…...

两种交换排序算法--冒泡,快速

目录 1.冒泡排序原理 2.快速排序原理 3.冒泡代码实现 4.快速排序代码实现 1.冒泡排序原理 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;基本思想是通过反复交换相邻的元素&#xff0c;直到整个序列有序。它的名字来源于较大的元素像气泡…...

语音交友app系统源码功能及技术研发流程剖析

语音交友App的核心功能包括语音聊天、语音房间、社交互动等&#xff0c;开发流程涵盖需求分析、技术选型、前后端开发、实时通信集成、测试优化、部署上线及运营维护。 一、语音交友App的大概功能 1. 语音聊天 一对一聊天&#xff1a;用户可与好友进行私密语音通话。 群组语音…...

零基础Vue入门7——状态管理Pinia

本节重点&#xff1a; pinia是什么pinia怎么用 pinia是什么 vue中组件间的数据传递&#xff1a; app.config.globalProperties&#xff1a;能够被应用内所有组件实例访问到的全局属性的对象props&#xff1a;父传子用provide&#xff1a;父传后代用 想象下有咩有哪些数据存储…...

Bash (Bourne-Again Shell)、Zsh (Z Shell)

文章目录 1. 历史背景2. 主要区别3. 功能对比自动补全插件和主题路径扩展提示符定制 4. 性能5. 使用场景6. 如何切换 Shell7. 总结 以下是 Bash 和 Zsh 之间的主要区别&#xff0c;列成表格方便对比&#xff1a; 特性BashZsh默认Shell大多数Linux发行版默认ShellmacOS默认She…...

Android studio 创建aar包给Unity使用

1、aar 是什么&#xff1f; 和 Jar有什么区别 aar 和 jar包 都是压缩包&#xff0c;可以使用压缩软件打开 jar包 用于封装 Java 类及其相关资源 aar 文件是专门为 Android 平台设计的 &#xff0c;可以包含Android的专有内容&#xff0c;比如AndroidManifest.xml 文件 &#…...

DeepSeek R1 简单指南:架构、训练、本地部署和硬件要求

DeepSeek 的 LLM 推理新方法 DeepSeek 推出了一种创新方法&#xff0c;通过强化学习 (RL) 来提高大型语言模型 (LLM) 的推理能力&#xff0c;其最新论文 DeepSeek-R1 对此进行了详细介绍。这项研究代表了我们如何通过纯强化学习来增强 LLM 解决复杂问题的能力&#xff0c;而无…...

图论常见算法

图论常见算法 算法prim算法Dijkstra算法 用途最小生成树&#xff08;MST&#xff09;&#xff1a;最短路径&#xff1a;拓扑排序&#xff1a;关键路径&#xff1a; 算法用途适用条件时间复杂度Kruskal最小生成树无向图&#xff08;稀疏图&#xff09;O(E log E)Prim最小生成树无…...

MySQL三大日志详解

在MySQL数据库的运行过程中&#xff0c;三大关键日志——binlog、redo log和undo log&#xff0c;起着至关重要的作用。理解这三大日志&#xff0c;对于深入掌握MySQL的工作原理、数据恢复以及主从复制等操作有着极大的帮助。本文将详细剖析这三大日志的作用和工作机制。 Binl…...

【SQL 中的分组查询与联合查询详解】

文章目录 SQL 中的分组查询与联合查询详解 1. GROUP BY分组查询 1.1 语句格式1.2 示例说明 1.2.1 分别查询哥哥组和弟弟组的英语成绩总和1.2.2 查询哥哥组的所有成绩总和 2. 联合查询 2.1 内连接 2.1.1 语法格式2.1.2 执行过程 2.2 外连接 2.2.1 左外连接2.2.2 右外连接 2.3 …...

【实战篇】用 Cursor 独立开发并上线电商类 Android APP 全攻略

一、为啥要用 Cursor 开发电商类 Android APP 家人们,如今电商类 APP 随处可见,不管是买衣服、食品,还是电子产品,都能通过这些 APP 轻松搞定。要是能自己开发一款电商类 Android APP,那可太酷啦!但开发 APP 可不是一件容易的事,涉及到很多技术,像写代码、设计界面、处…...

quartus24.1版本子模块因时钟问题无法综合通过,FPGA过OOC问题复盘

因为只负责一个子模块&#xff0c;所以需要单独对该子模块进行综合和过OOC&#xff0c;这时候已经有一些加虚拟pin文件&#xff0c;敲命令让子模块能过OOC的方法。但这个方法的前提是先过综合&#xff0c;然后再敲命令让虚拟管脚命令成功&#xff0c;最终可以过OOC。 今天负责…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

rm视觉学习1-自瞄部分

首先先感谢中南大学的开源&#xff0c;提供了很全面的思路&#xff0c;减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接&#xff1a;https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架&#xff1a; 代码框架结构&#xff1a;readme有…...

ZYNQ学习记录FPGA(二)Verilog语言

一、Verilog简介 1.1 HDL&#xff08;Hardware Description language&#xff09; 在解释HDL之前&#xff0c;先来了解一下数字系统设计的流程&#xff1a;逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端&#xff0c;在这个过程中就需要用到HDL&#xff0c;正文…...