gpt4 book ai didi

rust - 在必须使用 tonic::Status 的地方使用 Tonic 时如何处理外部错误?

转载 作者:行者123 更新时间:2023-12-05 02:39:27 25 4
gpt4 key购买 nike

我正在制作一个使用 Redis 客户端的基于 Tonic 的 gRPC 微服务。我想不出一个隐式转换 RedisError 的例子进入tonic::Status当发生异步错误时。

async fn make_transaction(
&self,
request: Request<TransactionRequest>,
) -> Result<Response<TransactionResponse>, Status> {
let mut con = self.client.get_async_connection().await?;
con.set("my_key", 42).await?;
...
}

来自 Redis 客户端的连接可能会像设置一样失败。我宁愿不使用 .map_err()因为这似乎打破了异步。

我在想我需要实现特征 From<Status>From<RedisError>但不知道该怎么做。这是我的尝试,但它不起作用,因为 Tonic 想要一个 tonic::Status , 不是 ApiError我制作的结构:

pub struct ApiError {}

impl From<tonic::Status> for ApiError {
fn from(err: Status) -> ApiError {
ApiError { }
}
}

impl From<RedisError> for Status {
fn from(err: redis::RedisError) -> ApiError {
ApiError { }
}
}

最佳答案

我设法通过使用自定义类型作为原始错误(在您的情况下为 RedisError)的过渡容器来解决此类问题,因此类似以下的内容可能对您有用还有:

pub struct ApiError {}

impl From<RedisError> for ApiError {
fn from(err: RedisError) -> Self {
Self { }
}
}

impl From<ApiError> for Status {
fn from(err: ApiError) -> Self {
Self::internal("Failed talking to Redis")
}
}

async fn set_key(client: ..., key: &str, value: i64) -> Result<(), ApiError> {
let mut con = client.get_async_connection().await?;
con.set(key, value).await?
...
}

async fn make_transaction(
&self,
request: Request<TransactionRequest>,
) -> Result<Response<TransactionResponse>, Status> {
set_key(self.client, "my_key".into(), 42).await?
}

我不确定这是否是最好的方法,但似乎可以完成这项工作。

关于rust - 在必须使用 tonic::Status 的地方使用 Tonic 时如何处理外部错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69135302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com