MST

星途 面试题库

面试题:Rust async/await中的错误处理

假设你有一个异步函数,它可能会因为网络问题(用`io::Error`模拟)或者其他自定义错误(定义一个简单的`MyError`枚举类型)而失败。请用`async/await`语法实现这个异步函数,并展示如何在调用这个异步函数时进行错误处理,同时要展示如何将不同类型的错误进行统一处理和传播。
44.9万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::io;

// 定义自定义错误枚举
#[derive(Debug)]
enum MyError {
    CustomError(String),
}

// 异步函数,可能返回 io::Error 或 MyError
async fn async_function() -> Result<(), Box<dyn std::error::Error>> {
    // 模拟网络问题返回 io::Error
    if rand::random() {
        return Err(Box::new(io::Error::new(io::ErrorKind::Other, "Network error")));
    }
    // 模拟自定义错误
    Err(Box::new(MyError::CustomError("Custom error occurred".to_string())))
}

#[tokio::main]
async fn main() {
    match async_function().await {
        Ok(_) => println!("Function executed successfully"),
        Err(e) => {
            eprintln!("An error occurred: {}", e);
            // 这里可以对错误进行统一处理和传播
            // 例如记录日志,或者根据不同错误类型进行不同处理
        }
    }
}
  1. 定义自定义错误枚举MyError枚举用于表示自定义错误类型。
  2. 异步函数async_function是一个异步函数,它可能会返回io::ErrorMyError。通过Box<dyn std::error::Error>将不同类型错误统一处理,实现错误的向上传播。
  3. 错误处理:在main函数中使用match语句对async_function返回的结果进行处理。如果成功则打印成功信息,失败则打印错误信息,并可以在此处进行统一的错误处理和传播操作。

请注意,上述代码使用了rand库来模拟随机返回不同类型错误,在实际使用中需要在Cargo.toml中添加rand = "0.8.5"依赖。并且使用了tokio作为异步运行时,需在Cargo.toml添加tokio = { version = "1.27.0", features = ["full"] }依赖。