网站建设公司帮企业建站的目的/中国的网络营销公司

网站建设公司帮企业建站的目的,中国的网络营销公司,万网搜官网,乐清网站只做今天聊聊rust中异常错误处理 1. 基础类型&#xff1a;Result 和 Option&#xff0c;之前判断空指针就用到过 Option<T> 用途&#xff1a;表示值可能存在&#xff08;Some(T)&#xff09;或不存在&#xff08;None&#xff09;&#xff0c;适用于无需错误信息的场景。 f…

今天聊聊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.mzph.cn/diannao/73837.shtml

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

相关文章

Python:单继承方法的重写

继承&#xff1a;让类和类之间转变为父子关系&#xff0c;子类默认继承父类的属性和方法 单继承&#xff1a; class Person:def eat(self):print("eat")def sing(self):print("sing") class Girl(Person):pass#占位符&#xff0c;代码里面类下面不写任何东…

[免费]直接整篇翻译pdf工具-支持多种语言

<闲来没事写篇博客填补中文知识库漏洞> 如题&#xff0c;[免费][本地]工具基于开源仓库&#xff1a; 工具 是python&#xff01;太好了&#xff0c;所以各个平台都可以&#xff0c;我这里基于windows. 1. 先把github代码下载下来&#xff1a; git clone https://githu…

UI设计中的用户反馈机制:提升交互体验的关键

hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在数字化产品泛滥的今天&#xff0c;用户与界面的每一次交互都在无形中塑造着他们对产品的认知。一个…

Hessian 矩阵是什么

Hessian 矩阵是什么 目录 Hessian 矩阵是什么Hessian 矩阵的性质及举例说明**1. 对称性****2. 正定性决定极值类型****特征值为 2(正),因此原点 ( 0 , 0 ) (0, 0) (0,0) 是极小值点。****3. 牛顿法中的应用****4. 特征值与曲率方向****5. 机器学习中的实际意义**一、定义与…

GPU视频编解码:Jetson VPI+multimedia_api视频编解码入门(一)

目录 一.Pipline与工具栈 二.硬件设备概况 三.GPU视频编解码框架 四.VPI编译使用实例 五. jetson_multimedia_api编译使用实例 一.Pipline与工具栈 二.硬件设备概况 三.GPU视频编解码框架 jetson设备目前不支持VPF框架&#xff0c;关于VPF的使用我在下节PC段使用X86进行安…

《深入理解AOP编程:从基础概念到Spring实现》

AOP编程 AOP(Aspect Oriented Programing) 面向切面编程 Spring动态代理开发 以切面为基本单位的程序开发&#xff0c;通过切脉你间的彼此协同&#xff0c;相互调用&#xff0c;完成程序构建 切面切入点额外功能 OOP(Object Oriented Programing)面向对象编程 java 以对象为基本…

Docker 实践与应用举例

一、引言 在当今快速发展的信息技术领域&#xff0c;容器化技术已成为推动软件开发、部署和运维变革的关键力量。Docker 作为容器化技术的领军者&#xff0c;以其高效、便捷、可移植等特性&#xff0c;被广泛应用于各种场景。它能够将应用程序及其依赖项打包成一个独立的容器&…

C++初阶——类和对象(一)

C初阶——类和对象&#xff08;一&#xff09; 一、面向过程和面向对象 1.面向过程 面向过程的程序设计&#xff08;Procedure-Oriented Programming&#xff09;&#xff0c;简称POP&#xff0c;是一种是以程序执行流程为核心的编程范式。它是先分析出解决问题所需要的的步…

Skyeye 云智能制造办公系统 VUE 版本 v3.15.13 发布

Skyeye 云智能制造&#xff0c;采用 Springboot winUI 的低代码平台、移动端采用 UNI-APP。包含 30 多个应用模块、50 多种电子流程&#xff0c;CRM、PM、ERP、MES、ADM、EHR、笔记、知识库、项目、门店、商城、财务、多班次考勤、薪资、招聘、云售后、论坛、公告、问卷、报表…

Obsidian Copilot:打造你的专属 AI 笔记助手

Obsidian Copilot作为一款非常受欢迎的Obsidian插件&#xff0c;不仅极大地提升了用户的笔记管理和信息检索效率&#xff0c;还通过其多样化的AI功能为用户带来了前所未有的便捷体验。本文将详细介绍Obsidian Copilot的核心特点、使用方法及个人体验分享。 核心特点 Obsidian…

制造业数字化转型,汽车装备制造企业数字化转型案例,智能制造数字化传统制造业数字化制造业数字化转型案例

《某制造业企业信息化整体解决方案》PPT展示了一个汽车装备企业的整体信息化解决方案&#xff0c;阐述了该企业的业务特点和现状&#xff0c;主要包括按订单生产、多级计划和产品跟踪等&#xff0c;分析了信息化建设的主要困难&#xff0c;如信息管理手工化、过程数据追溯困难、…

【Film】MovieAgent:自动化电影生成通过多智能体CoT规划

论文概览 自动化电影生成根据剧本概要和角色库创建具有一 致角色、同步字幕和音频的长篇视频。它涉及自动化叙 事规划、场景结构化, 和镜头构图,复制现实世界电影制作的层次推理。 核心贡献 提出MovieAgent,通过多智能体链式思维(CoT)规划实现自动化电影生成。首次探索并…

数据结构——最短路(BFS,Dijkstra,Floyd)

完整版可以看我的最短路问题模版总结_稠密图最短路-CSDN博客 考研数据结构只考BFS,Dijkstra和Floyd 下面代码以Acwing模板题为例 BFS代码 适用类型&#xff1a; 1.单源最短路径 2.无权图 3.不适用于带权图和负权回路图 //Acwing走迷宫bfs #include<bits/stdc.h>usi…

ftp替代品,如何提升数据交换的安全性与高效性?

文件传输协议&#xff08;FTP&#xff09;是一个跨平台的、简单且易于实现的协议&#xff0c;用于在网络上的服务器和客户端之间传输文件&#xff0c;也是企业会经常选择的一种传输方式。 业务场景一&#xff1a; 基于信息相关安全要求&#xff0c;医院会采用防火墙、网闸等将…

单片机开发资源分析的实战——以STM32G431RBT6为例子的单片机资源分析

目录 第一点&#xff1a;为什么叫STM32G431RBT6 从资源手册拿到我们的对STM32G431RBT6的资源描述 第二件事情&#xff0c;关心我们的GPIO引脚输出 第三件事情&#xff1a;去找对应外设的说明部分 第一点&#xff1a;为什么叫STM32G431RBT6 对于命名规则不太熟悉的朋友看这里…

Android PC 要来了?Android 16 Beta3 出现 Enable desktop experience features 选项

在之前的 《Android 桌面窗口新功能推进》 我们就聊过&#xff0c;Google 就一直在努力改进 Android 的内置桌面模式&#xff0c;例如添加了适当的窗口标题、捕捉窗口的能力、悬停选项、窗口大小调整、最小化支持、app-to-web 等。 比如在搭载 Android 15 QPR 1 Beta 2 的 Pix…

行为模式---状态模式

概念 状态模式是一种行为模式&#xff0c;用于在内部状态改变的时候改变其行为。它的核心思想就是允许一个对象在其内部状态改变的时候改变它的行为。状态模式通过将对象的状态封装成独立的类&#xff0c;并将其行为委托给当前的状态对象&#xff0c;从而使得对象行为随着状态…

网页复印机:只需一个网址,一键克隆任何网站!(可根据需求生成/优化相关代码)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 网页代码克隆神器:一键复刻精美设计,提升前端开发效率 📒🛠️ 使用⚓️ 相关链接 ⚓️📖 介绍 📖 每天对着别人的精美网站漏出羡慕的眼神,却苦于自己的前端技术不够硬,难以完美复刻?或者为了赶项目进度,不得不重复…

前端Vue3图像编辑功能(并生成mask图)

存在一个需求同豆包的图像生成的区域重绘功能,类似与下面这种 拆解一下需求, 1、鼠标移动上图像画面时出现跟随鼠标移动的空心圆形,移出图像画面、鼠标点击后、鼠标按下移动时消失,鼠标松开再次出现。 2、鼠标按下出现圆形透明颜色大小同空心圆形、鼠标按下移动形成轨迹,…

解决:ModuleNotFoundError: No module named ‘_sqlite3‘

报错&#xff1a; from _sqlite3 import * ModuleNotFoundError: No module named _sqlite3安装sqlite3支持组件: sudo apt-get install libsqlite3-dev进入之前下载的python包下&#xff0c;重新编译和安装Python ./configure --enable-loadable-sqlite-extensions make &a…