ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

gRPC 客户端如何优雅捕获错误?基于 grpc-errors 的 9 语言实战对比

gRPC 客户端如何优雅捕获错误?基于 grpc-errors 的 9 语言实战对比 gRPC 客户端如何优雅捕获错误基于 grpc-errors 的 9 语言实战对比【免费下载链接】grpc-errorsA handy guide to gRPC errors项目地址: https://gitcode.com/gh_mirrors/gr/grpc-errorsgrpc-errors是一个专为 gRPC 开发者打造的错误处理速查指南项目它用 Python、Go、C、C#、Node.js、Ruby、Rust、Scala、Swift 等 9 种语言演示了 gRPC 客户端如何捕获错误、读取错误信息message和状态码code。如果你正在学习 gRPC 错误处理或想快速查某种语言里错误到底长什么样这个项目就是最省时间的参考。 它解决什么问题在 gRPC 中服务端的每一次失败都会变成一个带状态码StatusCode和错误详情details的状态对象传给客户端。但不同语言的 SDK 暴露它的方式完全不同有的是异常有的是错误对象有的是回调参数。grpc-errors 用最简单的示例服务把差异拉平了——所有语言都对着同一个hello.proto定义来写hello.proto定义了两个方法SayHello正常返回Hey, (name)!SayHelloStrict当Name长度超过 10 个字符时服务端返回INVALID_ARGUMENT错误详情为Length of Name cannot be more than 10 characters以 Python 服务端为例python/server.py核心就是这两行context.set_details(Length of Name cannot be more than 10 characters) context.set_code(grpc.StatusCode.INVALID_ARGUMENT)客户端要做的就是在每个语言里接住这个错误取出它的文案和编号。 通用三步法任何语言都一样无论哪门语言优雅的 gRPC 错误处理都遵循同一套三步捕获错误通过异常Python/Ruby/C#、返回值Go、状态对象C或回调参数Node/Swift拿到它读取错误信息取出 details用于日志或提示用户读取状态码并分支按INVALID_ARGUMENT、NOT_FOUND、UNAVAILABLE等状态码执行不同恢复逻辑 9 语言错误处理速查对比语言错误形式取错误信息取状态码客户端示例路径Pythongrpc.RpcError异常e.details()e.code()python/client.pyGo第二返回值errorstatus.FromError(err).Message()errStatus.Code()go/client.goCgrpc::Status对象status.error_message()status.error_code()cpp/client.cppC#RpcException异常e.Status.Detaile.Status.StatusCodecsharp/Hello/HelloClient/Program.csNode.js回调err参数err.messageerr.codenode/client.jsRubyGRPC::BadStatus异常e.detailse.coderuby/client.rbRust返回值 / Result从 reply 中查看—rust/src/client.rsScalaStatusRuntimeExceptiongetStatus.getDescriptiongetStatus.getCodescala/src/main/scala/hello/client/HelloClient.scalaSwift回调NSErrorerror.localizedDescriptionerror.codeswift/HelloClient/HelloClient/ViewController.swift Pythontry/except 状态码分支Python 是最直观的语言之一python/client.pytry: response stub.SayHelloStrict(hello_pb2.HelloReq(NameLeonhard Euler)) except grpc.RpcError as e: print(e.details()) # 错误文案 status_code e.code() # grpc.StatusCode 枚举 if grpc.StatusCode.INVALID_ARGUMENT status_code: pass # 针对特定错误做处理 else: print(response.Result)e.code()返回的是grpc.StatusCode枚举.name可得到INVALID_ARGUMENT.value是(3, invalid argument)调试时非常有用。 Go一个 error 值走天下Go 风格是用第二返回值接住错误再用status.FromError解包出 Statusgo/client.goresp, err : c.SayHelloStrict(ctx, api.HelloReq{Name: Leonhard Euler}) if err ! nil { errStatus, _ : status.FromError(err) fmt.Println(errStatus.Message()) // 错误文案 fmt.Println(errStatus.Code()) // codes.InvalidArgument if codes.InvalidArgument errStatus.Code() { // 分支处理 } }注意官方建议不要拿int(code)去做逻辑判断状态码常量才是稳定契约。 C 与 C#状态对象 vs 异常Ccpp/client.cpp调用后返回grpc::Status用status.ok()判断成功与否失败则读error_message()与error_code()INVALID_ARGUMENT对应数字 3。C#csharp/Hello/HelloClient/Program.cs同步调用直接抛RpcException通过e.Status.Detail与e.Status.StatusCode访问错误。 回调系与异常系的其他语言Node.jserr出现在回调里err.code grpc.status.INVALID_ARGUMENT用于分支node/client.jsRubyrescue GRPC::BadStatus ee.code可拿到整数 3ruby/client.rbScala阻塞客户端抛StatusRuntimeException异步客户端在Future.onFailure里接住scala/src/main/scala/hello/client/HelloClient.scalaSwift / Objective-CiOS 生态里错误以NSError形式出现在完成回调中error.code与GRPC_STATUS_INVALID_ARGUMENT比较swift/HelloClient/HelloClient/ViewController.swift⚡ 6 个实战避坑技巧永远检查成功路径示例代码为简洁跳过了SayHello的错误检查生产代码不能省按状态码分支别按文案分支错误文案会改状态码是协议契约不要用整数状态码写业务逻辑int(code) 3只适合临时调试区分RpcError与超时/取消DeadlineExceeded、Cancelled通常需要重试或降级错误信息要记日志别直接吞掉details是服务端特意留给你排查的线索多语言项目统一错误语义对照上表的状态码列保证各端对INVALID_ARGUMENT等码的处理一致 如何跑起来看效果克隆仓库git clone https://gitcode.com/gh_mirrors/gr/grpc-errors安装 gRPC 与 protobuf 编译器各语言的生成说明见对应目录下的 README如 go/README.md、python/README.md先启动任一语言的服务端如python/server.py监听 50051 端口运行对应语言的客户端观察打印出的错误文案与INVALID_ARGUMENT✅ 总结gRPC 错误处理的核心就两样东西状态码和错误详情。不同 SDK 的包装方式虽然各异——异常、Status 对象、回调参数——但思路完全一致。grpc-errors 用 9 种语言的最小示例把这套错误捕获姿势讲得明明白白适合作为团队多语言项目的错误处理对照手册也适合新手快速建立 gRPC 错误处理的整体认知。【免费下载链接】grpc-errorsA handy guide to gRPC errors项目地址: https://gitcode.com/gh_mirrors/gr/grpc-errors创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表