MST
星途 面试题库

面试题:Rust闭包错误处理与异步操作结合

当Rust闭包用于异步任务中,并且闭包内的操作可能产生错误时,如从异步数据库查询操作返回`Result`类型。请说明如何正确处理闭包中的错误,确保异步任务能正常运行并恰当处理错误。请提供完整的异步闭包及错误处理代码示例,涉及`async/await`语法。
32.7万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::error::Error;
use tokio::task;

// 模拟一个异步数据库查询操作
async fn mock_db_query() -> Result<String, Box<dyn Error>> {
    // 这里模拟成功返回
    Ok("查询结果".to_string())
}

#[tokio::main]
async fn main() {
    let result = task::spawn(async move {
        // 异步闭包
        let query_result = mock_db_query().await;
        match query_result {
            Ok(data) => {
                println!("数据库查询成功: {}", data);
                Ok(())
            },
            Err(e) => {
                eprintln!("数据库查询错误: {}", e);
                Err(e)
            }
        }
    }).await.unwrap_or_else(|e| {
        eprintln!("任务执行失败: {}", e);
        panic!("任务执行失败");
    });

    if let Err(e) = result {
        eprintln!("最终错误处理: {}", e);
    }
}
  1. 异步闭包及内部错误处理
    • 在闭包内部,mock_db_query().await调用异步数据库查询函数。它返回一个Result类型,所以通过match语句来处理可能的成功和失败情况。
    • 如果查询成功,打印查询结果并返回Ok(());如果失败,打印错误信息并返回Err(e)
  2. 外部任务结果处理
    • 使用task::spawn创建一个异步任务,该任务包含上述异步闭包。
    • await任务结果,并使用unwrap_or_else处理任务执行过程中可能出现的JoinError,例如任务被取消等情况。如果任务执行成功,继续处理任务返回的Result类型结果。
    • 最后,再次对任务返回的Result类型结果进行处理,如果是Err,打印最终的错误信息。这样确保了异步任务能正常运行并恰当处理各个阶段可能出现的错误。