news 2026/6/11 1:49:02

【Rust】07-错误处理:Option、Result 与 ? 运算符

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Rust】07-错误处理:Option、Result 与 ? 运算符

错误处理:Option、Result 与 ? 运算符

学习目标

  • 理解 Rust 不使用异常作为主要错误处理机制。
  • 掌握Option<T>Result<T, E>
  • 学会使用?传播错误。

Rust 的错误处理思路

Rust 把错误分成两类:

  • 可恢复错误:文件不存在、解析失败、网络请求失败等,通常用Result<T, E>
  • 不可恢复错误:数组越界、违反内部不变量等,通常用panic!

Rust 没有传统异常机制。函数是否可能失败,会体现在返回类型里。

Option

Option<T>表示一个值可能存在,也可能不存在:

enumOption<T>{Some(T),None,}

示例:

fnfirst_char(text:&str)->Option<char>{text.chars().next()}fnmain(){matchfirst_char("rust"){Some(ch)=>println!("{ch}"),None=>println!("empty string"),}}

Option常用于查找结果、可选配置、集合取值等场景。

Result

Result<T, E>表示成功或失败:

enumResult<T,E>{Ok(T),Err(E),}

示例:

fnparse_number(text:&str)->Result<i32,std::num::ParseIntError>{text.parse::<i32>()}fnmain(){matchparse_number("42"){Ok(number)=>println!("{number}"),Err(err)=>println!("parse failed: {err}"),}}

unwrap 与 expect

unwrap会在NoneErr时 panic:

letnumber="42".parse::<i32>().unwrap();

expect可以提供更清晰的错误信息:

letnumber="42".parse::<i32>().expect("expected a valid integer");

学习和原型阶段可以适度使用,但业务代码中应该优先显式处理错误或向上传播错误。

? 运算符

?用于简化错误传播:

usestd::fs;usestd::io;fnread_config()->Result<String,io::Error>{letcontent=fs::read_to_string("config.txt")?;Ok(content)}

如果read_to_string成功,?取出Ok里的值。如果失败,函数立即返回Err

可以进一步写短:

usestd::fs;usestd::io;fnread_config()->Result<String,io::Error>{fs::read_to_string("config.txt")}

但当函数中有多步操作时,?非常有用。

main 返回 Result

main也可以返回Result

usestd::error::Error;usestd::fs;fnmain()->Result<(),Box<dynError>>{letcontent=fs::read_to_string("config.txt")?;println!("{content}");Ok(())}

Box<dyn Error>可以表示多种错误类型,适合示例、小工具或命令行程序入口。

Option 的常用方法

fnmain(){letname=Some("Rust");println!("{}",name.unwrap_or("unknown"));println!("{}",name.map(|value|value.len()).unwrap_or(0));}

常见方法包括:

  • unwrap_or:不存在时使用默认值。
  • map:存在时转换内部值。
  • and_then:链式处理可能失败的步骤。

常见误区

  • 不要把unwrap当成正常错误处理。
  • 能恢复的错误优先用Result,不是panic!
  • ?只能用于返回ResultOption或兼容类型的函数。
  • Option表示缺失,Result表示成功或失败及失败原因。

练习

  1. 写一个函数,把字符串解析成u32,返回Result<u32, ParseIntError>
  2. 写一个函数,返回字符串的第一个字符,空字符串返回None
  3. ?读取一个文件并返回内容。

后记

2026年6月10日17点27分于上海。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 1:48:53

【大连大学、大连市计算机学会、中国电子学会智慧医疗专家委员会三方主办 | SPIEIET双出版 | 连续2届稳定EI检索】第三届图像处理、智能控制与计算机工程国际学术会议(IPICE 2026)

第三届图像处理、智能控制与计算机工程国际学术会议&#xff08;IPICE 2026&#xff09; 2026 3rd International Conference on Image Processing, Intelligent Control and Computer Engineering 2026年7月17-19日 中国大连&#xff08;线上&线下双会场&#xff09; …

作者头像 李华
网站建设 2026/6/11 1:42:55

5分钟快速上手F3D:轻量级3D可视化工具的完整指南

5分钟快速上手F3D&#xff1a;轻量级3D可视化工具的完整指南 【免费下载链接】f3d Fast and minimalist 3D viewer. 项目地址: https://gitcode.com/GitHub_Trending/f3/f3d F3D是一个快速且极简的3D可视化工具&#xff0c;专为需要高效查看和交互式探索3D模型的技术爱好…

作者头像 李华
网站建设 2026/6/11 1:38:52

Windows虚拟桌面效率神器:VDesk让你的多任务处理效率翻倍

Windows虚拟桌面效率神器&#xff1a;VDesk让你的多任务处理效率翻倍 【免费下载链接】VDesk Launch programs on new virtual desktops. 项目地址: https://gitcode.com/gh_mirrors/vd/VDesk 你是否经常在Windows 10中同时处理多个项目&#xff0c;却苦于窗口混乱、任务…

作者头像 李华
网站建设 2026/6/11 1:37:53

学会健康的元认知反刍——给年轻人的心理肌肉训练

学会健康的元认知反刍——给年轻人的心理肌肉训练作者&#xff1a;认知诊断与Prompt设计 | 版本&#xff1a;v1.0 版权&#xff1a;可免费使用、转发、改编&#xff0c;请保留作者名。禁止商业售卖。适用场景&#xff1a;AI心理支持对话、情绪日记助手、学校心理辅导辅助工具一…

作者头像 李华