面试题答案
一键面试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);
// 这里可以对错误进行统一处理和传播
// 例如记录日志,或者根据不同错误类型进行不同处理
}
}
}
- 定义自定义错误枚举:
MyError
枚举用于表示自定义错误类型。 - 异步函数:
async_function
是一个异步函数,它可能会返回io::Error
或MyError
。通过Box<dyn std::error::Error>
将不同类型错误统一处理,实现错误的向上传播。 - 错误处理:在
main
函数中使用match
语句对async_function
返回的结果进行处理。如果成功则打印成功信息,失败则打印错误信息,并可以在此处进行统一的错误处理和传播操作。
请注意,上述代码使用了rand
库来模拟随机返回不同类型错误,在实际使用中需要在Cargo.toml
中添加rand = "0.8.5"
依赖。并且使用了tokio
作为异步运行时,需在Cargo.toml
添加tokio = { version = "1.27.0", features = ["full"] }
依赖。