rust学习笔记17-异常处理

今天聊聊rust中异常错误处理

1. 基础类型:Result 和 Option,之前判断空指针就用到过

Option<T>
  • 用途:表示值可能存在(Some(T))或不存在(None),适用于无需错误信息的场景。

    fn print_list(head: Option<&Box<ListNode>>) {match head {Some(node) => {let mut current = Some(node); // 初始化当前节点指针while let Some(node) = current {print!("{} -> ", node.val);current = node.next.as_ref(); // 使用 as_ref() 获取对 next 的引用}println!("None");}None => {println!("链表为空");}}
    }

Result<T, E>
  • 用途:表示操作可能成功(Ok(T))或失败(Err(E)),E 为错误类型。

    fn divide(numerator: f64, denominator: f64) -> Result<f64, String> {if denominator == 0.0 {Err(String::from("Denominator cannot be zero!"))} else {Ok(numerator / denominator)}
    }

2.快捷方法:unwrap 和 expect 

unwrap():成功返回值,失败则 panic。

expect(msg):类似 unwrap,但可附加错误信息。

let content = read_file("file.txt").unwrap(); // 危险:可能崩溃let content = read_file("file.txt").expect("读取文件失败");

3.错误传播:? 运算符
        简化错误传播:自动将错误返回给调用者,需函数返回 Result。

fn process_file() -> Result<(), std::io::Error> {let content = read_file("file.txt")?; // 错误时直接返回println!("Content: {}", content);Ok(())
}

4.自定义错误,一般接口校验用的多

写一个校验错误有如下四个,id为空,name重名,id查询为空,name限制30字符超长错误

use std::fmt;
//原生写法
// 定义校验错误枚举
#[derive(Debug, PartialEq)]
pub enum ValidationError {IdEmpty,NameDuplicate(String),  // 携带重复的名称IdNotFound(String),     // 携带未找到的IDNameTooLong(usize),     // 携带实际长度
}// 实现错误描述
impl fmt::Display for ValidationError {fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {match self {ValidationError::IdEmpty => write!(f, "ID不能为空"),ValidationError::NameDuplicate(name) => write!(f, "名称 '{}' 已存在", name),ValidationError::IdNotFound(id) => write!(f, "ID '{}' 不存在", id),ValidationError::NameTooLong(len) => write!(f, "名称长度不能超过30字符(当前长度:{})", len),}}
}// 实现标准错误Trait
impl std::error::Error for ValidationError {}

使用 thiserror 简化(推荐)

[dependencies]
thiserror = "1.0"

use thiserror::Error;#[derive(Error, Debug, PartialEq)]
pub enum ValidationError {#[error("ID不能为空")]IdEmpty,#[error("名称 '{0}' 已存在")]NameDuplicate(String),#[error("ID '{0}' 不存在")]IdNotFound(String),#[error("名称长度不能超过30字符(当前长度:{0})")]NameTooLong(usize),
}// 校验用户输入
pub fn validate_user_input(id: &str, name: &str) -> Result<(), ValidationError> {// 检查ID是否为空if id.trim().is_empty() {return Err(ValidationError::IdEmpty);}// 检查名称长度if name.len() > 30 {return Err(ValidationError::NameTooLong(name.len()));}Ok(())
}// 模拟检查名称是否重复
pub fn check_name_unique(name: &str) -> Result<(), ValidationError> {let existing_names = vec!["Alice", "Bob"];if existing_names.contains(&name) {return Err(ValidationError::NameDuplicate(name.to_string()));}Ok(())
}// 模拟根据ID查询数据是否存在
pub fn find_by_id(id: &str) -> Result<(), ValidationError> {let valid_ids = vec!["1001", "1002"];if !valid_ids.contains(&id) {return Err(ValidationError::IdNotFound(id.to_string()));}Ok(())
}fn main() {let existing_names = vec![String::from("Alice"), String::from("Bob")];// 测试不同的错误场景match validate_user_input("", "Charlie") {Ok(_) => println!("校验成功."),Err(e) => println!("校验失败: {}", e),}match check_name_unique( "Alice") {Ok(_) => println!("校验成功."),Err(e) => println!("校验失败: {}", e),}match find_by_id("789") {Ok(_) => println!("校验成功."),Err(e) => println!("校验失败: {}", e),}match validate_user_input("123", &"A".repeat(31)) {Ok(_) => println!("校验成功."),Err(e) => println!("校验失败: {}", e),}
}

总结,rust没有try/catch这样的异常处理机制,而是通过Result 和 Option这样枚举处理,unwrap 和 expect在开发调试过程中用比较多,自定义错误,校验类函数用的多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35884.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IIS 服务器日志和性能监控

Internet Information Services &#xff08;IIS&#xff09; 是 Microsoft 提供的一款功能强大、灵活且可扩展的 Web 服务器&#xff0c;用于托管网站、服务和应用程序。IIS 支持 HTTP、HTTPS、FTP、SMTP 和更多用于提供网页的协议&#xff0c;因此广泛用于企业环境。 IIS 的…

基于Netty实现高性能HTTP反向代理

以下将分步骤实现一个基于Netty的高性能HTTP反向代理&#xff0c;支持动态路由、负载均衡和基础鉴权功能。 1. 项目依赖配置&#xff08;Maven&#xff09; 2. 定义路由规则 3. 实现HTTP反向代理服务端 4. 实现反向代理处理器 5. 实现基础鉴权 6. 性能优化策略 连接池管理…

Feedback-Guided Autonomous Driving

Feedback-Guided Autonomous Driving idea 问题设定&#xff1a;基于 CARLA 的目标驱动导航任务&#xff0c;通过知识蒸馏&#xff0c;利用特权智能体的丰富监督信息训练学生传感器运动策略函数 基于 LLM 的端到端驱动模型&#xff1a;采用 LLaVA 架构并添加航点预测头&#…

OpenCV基础【图像和视频的加载与显示】

目录 一.创建一个窗口&#xff0c;显示图片 二.显示摄像头/多媒体文件 三.把摄像头录取到的视频存储在本地 四.鼠标回调事件 五.TrackBar滑动条 一.创建一个窗口&#xff0c;显示图片 import cv2img_path "src/fengjing.jpg" # 自己的图片路径 img cv2.imre…

springboot实现调用百度ocr实现身份识别

一、技术选型 OCR服务&#xff1a;推荐使用百度AI 二、实现 1.注册一个服务 百度智能云控制台https://console.bce.baidu.com/ai-engine/ocr/overview/index?_1742309417611 填写完之后可以获取到app-id、apiKey、SecretKey这三个后面文件配置会用到 2、导入依赖 <!-- …

Linux--内核进程O(1)调度队列

⼀个CPU拥有⼀个runqueue 如果有多个CPU就要考虑进程个数的负载均衡问题 优先级 普通优先级&#xff1a;100〜139&#xff08;我们都是普通的优先级&#xff0c;想想nice值的取值范围&#xff0c;可与之对应&#xff01;&#xff09;实时优先级&#xff1a;0〜99&#xff08…

1.排序算法(学习自用)

1.冒泡排序 算法步骤 相邻的元素之间对比&#xff0c;每次早出最大值或最小值放到最后或前面&#xff0c;所以形象的称为冒泡。 特点 n个数排序则进行n轮&#xff0c;每轮比较n-i次。所以时间复杂度为O(n^2)&#xff0c;空间复杂度为O(1)&#xff0c;该排序算法稳定。 代码…

DiskGenius 硬盘管理工具下载+D盘空间扩容给C盘教程

目录 D盘空间扩容给C盘教程 1、打开DiskGenius软件​编辑 2、右键D盘&#xff08;或需要压缩的磁盘&#xff09;-->调整分区大小 3、调整分区容量 4、点击是/确定后&#xff0c;等待几分钟电脑自行操作&#xff0c;重启后硬盘就重新分好了 5、展示效果 DiskGenius – …

[项目]基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信

基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信 一.Si24Ri原理图二.Si24R1芯片手册解读三.驱动函数讲解五.移植2.4g通讯&#xff08;飞控部分&#xff09;六.移植2.4g通讯&#xff08;遥控部分&#xff09;七.通讯模块的完成&#xff08;遥控部分&#xff09; 一.Si24Ri原理图 S…

springboot集成xxl-job

前言&#xff1a;关于xxl-job的一些简单的介绍就不做过多介绍&#xff0c;本文主要讲一下如何将xxl-job整合到springboot项目中。先贴上项目的两个地址&#xff1a; 1.github&#xff1a; https://github.com/xuxueli/xxl-job 2.码云&#xff1a;http://gitee.com/xuxueli0323/…

预处理指令中#if 和 #endif的用法

在 C 语言中&#xff0c;#if 和 #endif 是预处理指令&#xff0c;用于条件编译。它们的核心作用是&#xff1a;根据预处理器能够识别的条件&#xff08;通常是宏定义或常量表达式&#xff09;&#xff0c;决定某段代码是否参与编译。 — 基本功能 #if 用于开启一个条件编译块…

【统计学相关知识】极小充分统计量

定义、判别&#xff0c;计算上的定义 极小充分统计量不具有唯一性&#xff0c;具有不变性&#xff0c;线性映射仍然是极小充分统计量 一般来说&#xff0c;使用因子分解定义找到的充分统计量&#xff0c;直观地找到的&#xff0c;一般是极小充分统计量&#xff0c;但还是要遵…

winx64 安装对应版本火狐浏览器驱动

#本人需要学习使用selenium 选择对应的浏览器是firefox 为什么 因为喜欢 首先需要确定你的浏览器版本 在火狐的设置常规中你就能发现 Supported platforms — Firefox Source Docs documentation (mozilla.org) 以上链接参照Supported platforms 找到对应版本 &#xff08;注…

【最后203篇系列】016 Q201架构思考

前言 Q200已经达到了我既定的目标&#xff0c;在最近的3个月&#xff0c;我需要进一步完善&#xff0c;达到可以试产的程度。 在这个过程当中&#xff0c;许多知识和体会一直在变。 qtv200到目前&#xff0c;虽然通过习惯(每晚运行离线策略和比对)方式维持了注意力的集中&…

埃森哲中捷石化proposalv04(64页PPT)(文末有下载方式)

资料解读&#xff1a;埃森哲中捷石化proposalv04 详细资料请看本解读文章的最后内容。 埃森哲公司为中捷石化提供的ERP和MES系统实施项目提案&#xff0c;旨在通过信息化手段提升中捷石化的精细化管理水平。该提案详细阐述了埃森哲对中捷石化现状的理解、建议的解决方案、实施…

【2025新版本】【谷粒商城版】Kubernetes

本文作者&#xff1a; slience_me 文章目录 【2025】Kubernetes1. docker安装2. kubernetes安装前3. kubeadm,kubelet,kubectl3.1 简介kubeadmkubeletkubectl常用指令 3.2 安装3.3 kubeadm初始化3.4 加入从节点(工作节点)3.5 安装Pod网络插件&#xff08;CNI&#xff09;3.6 Ku…

Unity 运行报错:InvalidOperationException: Insecure connection not allowed 的原因

当你在 Unity 中运行项目时&#xff0c;如果遇到 InvalidOperationException: Insecure connection not allowed 这个错误&#xff0c;通常是由于以下原因导致的&#xff1a; 1. UnityWebRequest 的安全限制 UnityWebRequest 是 Unity 用于发送 HTTP 请求的核心组件。从 Unit…

ubuntu下TFTP服务器搭建

tftp 命令的作用和 nfs 命令一样&#xff0c;都是用于通过网络下载东西到 DRAM 中&#xff0c;只是 tftp 命令 使用的 TFTP 协议&#xff0c; Ubuntu 主机作为 TFTP 服务器。因此需要在 Ubuntu 上搭建 TFTP 服务器&#xff0c; 需要安装 tftp-hpa 和 tftpd-hpa&#xff0c;命令…

Python+Django网页前后端rsp云端摄像头人数监控系统

程序示例精选 PythonDjango网页前后端rsp云端摄像头人数监控系统 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonDjango网页前后端rsp云端摄像头人数监控系统》编写代码&#xff0c;…

糊涂人寄信

1.糊涂人寄信 - 蓝桥云课 糊涂人寄信 题目描述 有一个糊涂人&#xff0c;写了 n 封信和 n 个信封&#xff0c;到了邮寄的时候&#xff0c;把所有的信都装错了信封。求装错信封可能的种类数。 输入描述 有多行读入&#xff0c;每行输入一个正整数 n&#xff0c;表示一种情况…