7 个版本
0.3.0 | 2022 年 7 月 5 日 |
---|---|
0.2.2 | 2022 年 7 月 5 日 |
0.1.2 | 2022 年 7 月 2 日 |
#8 in #response-status
461 每月下载量
7KB
一个辅助 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