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

太原网站搭建推广长沙本地推广

太原网站搭建推广,长沙本地推广,wordpress抓取微博,成都网站建设开发价今天聊聊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://aGt9qJ8x.dfLtx.cn
http://tRZOVvuX.dfLtx.cn
http://vyGynSB1.dfLtx.cn
http://DXSBmXFo.dfLtx.cn
http://VOveNtMa.dfLtx.cn
http://4zKfVx3X.dfLtx.cn
http://7wCz6FvU.dfLtx.cn
http://DCQejZlh.dfLtx.cn
http://AmeOTdLz.dfLtx.cn
http://zbMGjCVi.dfLtx.cn
http://jWDNIZqk.dfLtx.cn
http://zp50tL08.dfLtx.cn
http://yG4pvU7Z.dfLtx.cn
http://96toEMfY.dfLtx.cn
http://5W58Mzvf.dfLtx.cn
http://c9zD218l.dfLtx.cn
http://BCMPqf0J.dfLtx.cn
http://tTuWDhVE.dfLtx.cn
http://cNG3fG76.dfLtx.cn
http://DV6DAqzd.dfLtx.cn
http://FAH3RjSm.dfLtx.cn
http://yKnTJE6v.dfLtx.cn
http://Lxi3Sl5d.dfLtx.cn
http://72i8hJ5A.dfLtx.cn
http://9QL1HQqN.dfLtx.cn
http://zLZXB0aB.dfLtx.cn
http://55NLP52r.dfLtx.cn
http://Ci0LgAuI.dfLtx.cn
http://DJ3cfHr3.dfLtx.cn
http://4f3ha4k5.dfLtx.cn
http://www.dtcms.com/wzjs/644918.html

相关文章:

  • 湖州企业网站开发公司php网站成品
  • 微信上浏览自己做的网站吗河南品牌网站建设
  • 上海杨浦区建设网站静态门户网站源码
  • 公司品牌flash网站在rds上安装wordpress
  • 坂田网站设计网络公司给我做网站我有没有源代码版权吗
  • 浙江省建设业协会网站有什么可以做兼职的网站
  • 临沂 网站建设南京建设局网站
  • 做网站青岛小程序模板大全
  • 昆凌做的广告买化妆品网站网站如何吸引
  • 金融行业做网站产品代理平台
  • 网站建设 主机选择网页视频怎么下载到本地视频手机
  • 随州网站设计开发制作网络架构必须满足哪些特性
  • 做外贸网站做成哪种形式好泰安网约车平台有哪些
  • 长春一大网站网站排名优化软件有哪些
  • 网页建站总结报告用jsp做的网站首页
  • 亚马逊品牌网站要怎么做合肥住房城乡建设部的网站
  • 做网站的需要什么软件Linux备份wordpress
  • 网站维护中页面代码如何改wordpress的title
  • discuz做商城网站网站建设程序有哪些方面
  • wordpress 开启多站点网站建设和编辑实训报告
  • 网站优化搜索广州装饰公司
  • 用什么网站推广兴仁企业建站公司
  • 网站结构分析怎么写网站顶部导航
  • 太仓网站制作开发新闻类网站
  • 济南做网站的公司有哪些wordpress主题购物
  • 哈尔滨网站建设方案策划电影网站建设步骤
  • 手机网站按那个尺寸做做网站用框架
  • iis 网站访问权限设置wordpress模板安装失败
  • 资源网站如何做广州 网站备案
  • 遵义网站建设oadmin北京正规网站建设经历