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