#error #tonic #grpc #response-status

tonic-error

实现 derive trait 以允许通过 tonic Status 响应传递自定义错误

7 个版本

0.3.0 2022 年 7 月 5 日
0.2.2 2022 年 7 月 5 日
0.1.2 2022 年 7 月 2 日

#8 in #response-status

Download history 9/week @ 2024-03-12 1/week @ 2024-03-26 12/week @ 2024-04-02 28/week @ 2024-04-23 1/week @ 2024-05-07 12/week @ 2024-05-14 20/week @ 2024-05-21 70/week @ 2024-05-28 76/week @ 2024-06-04 7/week @ 2024-06-11 29/week @ 2024-06-18 346/week @ 2024-06-25

461 每月下载量

Apache-2.0

7KB

Crates Badge License: Apache 2.0

一个辅助 trait,用于帮助通过 return tonic::Status 消息传递错误类型。

使用方法

此库与 thiserror 库兼容,但使用该库不是必需的。如果您不使用 thiserror,则目前您需要手动为您的类型实现 std::fmt::Display。您的错误类型还需要实现 serde::{Serialize, Deserialize}

为了使用此库,您需要在您的错误类型上使用 #[derive(TonicError)]

#[derive(Debug, Error, TonicError, Serialize, Deserialize)]
pub enum MathsError {
    #[error("division by zero for inputs: a={0} b={1}")]
    DivByZero(i32, i32),
}

TonicError trait 为您的类型提供了 std::convert::TryFrom 的实现,并为 tonic::Status 提供了 std::convert::From 的实现。

以下示例取自包含的示例。

服务器端

async fn div(&self, req: Request<DivRequest>) -> Result<Response<DivResponse>, Status> {
    let req = req.into_inner();
    if req.b == 0 {
        return Err(MathsError::DivByZero(req.a, req.b).into());
    }
    let result = req.a as f64 / req.b as f64;
    Ok(Response::new(DivResponse { result }))
}

客户端

pub async fn div(&mut self, a: i32, b: i32) -> Result<f64, MathsError> {
    let req = Request::new(DivRequest { a, b });

    let resp = match self.client.div(req).await {
        Ok(r) => r,
        Err(e) => match e.code() {
            Code::Internal => {
                return Err(e.try_into().expect("could not convert status to error"))
            }
            _ => panic!("error making rpc call: {e}"),
        },
    };

    Ok(resp.into_inner().result)
}

示例

请查看本仓库中的 tonic-error-example 子目录中的工作客户端/服务器示例。

许可证

此项目采用 Apache 2.0 许可证发布。

依赖关系

约 5–7.5MB
约 128K SLoC