使用try!宏实现
use std::fs::File;
use std::io::{self, Read};
use std::error::Error;
// 假设这是解析函数,返回Result<T, E>
fn parse_text(text: &str) -> Result<(), Box<dyn Error>> {
// 这里写实际的解析逻辑,示例中只是简单返回Ok
Ok(())
}
fn read_and_parse_with_try() -> Result<(), Box<dyn Error>> {
let mut file = try!(File::open("example.txt"));
let mut contents = String::new();
try!(file.read_to_string(&mut contents));
try!(parse_text(&contents));
Ok(())
}
使用?运算符实现
use std::fs::File;
use std::io::{self, Read};
use std::error::Error;
fn parse_text(text: &str) -> Result<(), Box<dyn Error>> {
// 这里写实际的解析逻辑,示例中只是简单返回Ok
Ok(())
}
fn read_and_parse_with_question() -> Result<(), Box<dyn Error>> {
let mut file = File::open("example.txt")?;
let mut contents = String::new();
file.read_to_string(&mut contents)?;
parse_text(&contents)?;
Ok(())
}
优缺点分析
- 优点:
- ?运算符:语法更简洁,使代码更紧凑易读,特别是在处理多个连续的可能返回错误的操作时。它是Rust 1.13引入的现代错误处理语法糖。
- try!宏:对于不支持?运算符的旧版本Rust(1.13之前)是唯一类似的错误处理手段,并且从语义上try!宏表达了 “尝试执行这个操作,如果失败则返回错误” 的意图。
- 缺点:
- ?运算符:在非常旧的Rust版本中不可用。
- try!宏:语法相对冗长,在处理多个连续的可能返回错误的操作时,代码会显得较为繁琐。