获取 Golang gRPC 的错误类型
当我们在 Golang 中使用 gRPC 时,通常会使用 context 来控制超时时间,如果一个 rpc 调用超时了,我们如何通过错误类型来确定呢? 可以使用 grpc 的 codes
和 status
两个 package 来实现:
如下示例代码:
package main
import (
"context"
"time"
grpccodes "google.golang.org/grpc/codes"
grpcstatus "google.golang.org/grpc/status"
)
func call() error {
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
req := &pb.Req{
Arg: 1,
}
resp, err := client.CallSomething(ctx, req)
if err != nil {
if rpcErr, ok := grpcstatus.FromError(err); ok {
if rpcErr.Code() == grpccodes.Canceled ||
rpcErr.Code() == grpccodes.DeadlineExceeded {
log.Warnf("RPC call timeout: %s", err)
return nil
}
}
return err
}
return nil
}
