MST

星途 面试题库

面试题:Rust错误处理中try!宏与?运算符的实际应用场景分析

假设你正在开发一个文件读取并解析的Rust程序,要求从文件中读取文本,解析成特定格式的数据结构。在此过程中,可能会遇到文件不存在、文件读取错误、解析错误等多种错误。请分别使用try!宏和?运算符来实现该功能,并分析在这个场景下两者的优缺点。
22.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

使用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!宏:语法相对冗长,在处理多个连续的可能返回错误的操作时,代码会显得较为繁琐。