原理:

使用status包对grpc内的错误进行识别!

代码:

  1. r, err := c.SayHello(ctx, &pb.HelloRequest{Name: "world"})
  2. if err != nil {
  3. s := status.Convert(err)
  4. for _, d := range s.Details() {
  5. switch info := d.(type) {
  6. case *epb.QuotaFailure:
  7. log.Printf("Quota failure: %s", info)
  8. default:
  9. log.Printf("Unexpected type: %s", info)
  10. }
  11. }
  12. os.Exit(1)
  13. }

服务端:

st := status.New(codes.ResourceExhausted, "Request limit exceeded.")
        ds, err := st.WithDetails(
            &epb.QuotaFailure{
                Violations: []*epb.QuotaFailure_Violation{{
                    Subject:     fmt.Sprintf("name:%s", in.Name),
                    Description: "Limit one greeting per person",
                }},
            },
        )
        if err != nil {
            return nil, st.Err()
        }