错误处理Option、Result 与 ? 运算符学习目标理解 Rust 不使用异常作为主要错误处理机制。掌握OptionT和ResultT, E。学会使用?传播错误。Rust 的错误处理思路Rust 把错误分成两类可恢复错误文件不存在、解析失败、网络请求失败等通常用ResultT, E。不可恢复错误数组越界、违反内部不变量等通常用panic!。Rust 没有传统异常机制。函数是否可能失败会体现在返回类型里。OptionOptionT表示一个值可能存在也可能不存在enumOptionT{Some(T),None,}示例fnfirst_char(text:str)-Optionchar{text.chars().next()}fnmain(){matchfirst_char(rust){Some(ch)println!({ch}),Noneprintln!(empty string),}}Option常用于查找结果、可选配置、集合取值等场景。ResultResultT, E表示成功或失败enumResultT,E{Ok(T),Err(E),}示例fnparse_number(text:str)-Resulti32,std::num::ParseIntError{text.parse::i32()}fnmain(){matchparse_number(42){Ok(number)println!({number}),Err(err)println!(parse failed: {err}),}}unwrap 与 expectunwrap会在None或Err时 panicletnumber42.parse::i32().unwrap();expect可以提供更清晰的错误信息letnumber42.parse::i32().expect(expected a valid integer);学习和原型阶段可以适度使用但业务代码中应该优先显式处理错误或向上传播错误。? 运算符?用于简化错误传播usestd::fs;usestd::io;fnread_config()-ResultString,io::Error{letcontentfs::read_to_string(config.txt)?;Ok(content)}如果read_to_string成功?取出Ok里的值。如果失败函数立即返回Err。可以进一步写短usestd::fs;usestd::io;fnread_config()-ResultString,io::Error{fs::read_to_string(config.txt)}但当函数中有多步操作时?非常有用。main 返回 Resultmain也可以返回Resultusestd::error::Error;usestd::fs;fnmain()-Result(),BoxdynError{letcontentfs::read_to_string(config.txt)?;println!({content});Ok(())}Boxdyn Error可以表示多种错误类型适合示例、小工具或命令行程序入口。Option 的常用方法fnmain(){letnameSome(Rust);println!({},name.unwrap_or(unknown));println!({},name.map(|value|value.len()).unwrap_or(0));}常见方法包括unwrap_or不存在时使用默认值。map存在时转换内部值。and_then链式处理可能失败的步骤。常见误区不要把unwrap当成正常错误处理。能恢复的错误优先用Result不是panic!。?只能用于返回Result、Option或兼容类型的函数。Option表示缺失Result表示成功或失败及失败原因。练习写一个函数把字符串解析成u32返回Resultu32, ParseIntError。写一个函数返回字符串的第一个字符空字符串返回None。用?读取一个文件并返回内容。后记2026年6月10日17点27分于上海。