Pattern for rich error handling in gRPC

前端 未结 2 736
名媛妹妹
名媛妹妹 2020-12-13 04:45

What is the pattern for sending more details about errors to the client using gRPC?

For example, suppose I have a form for registering a user, that sends a message

2条回答
  •  臣服心动
    2020-12-13 05:02

    We have 3 different ways we could handle the errors in gRPC. For example lets assume the gRPC server does not accept values above 20 or below 2.

    1. Using gRPC status codes.

      if(number < 2 || number > 20){
           Status status = Status.FAILED_PRECONDITION.withDescription("Not between 2 and 20");
           responseObserver.onError(status.asRuntimeException());
       }
      
    2. Metadata (we can pass objects via metadata)

      if(number < 2 || number > 20){
           Metadata metadata = new Metadata();
           Metadata.Key responseKey = ProtoUtils.keyForProto(ErrorResponse.getDefaultInstance());
           ErrorCode errorCode = number > 20 ? ErrorCode.ABOVE_20 : ErrorCode.BELOW_2;
           ErrorResponse errorResponse = ErrorResponse.newBuilder()
                   .setErrorCode(errorCode)
                   .setInput(number)
                   .build();
           // pass the error object via metadata
           metadata.put(responseKey, errorResponse);
           responseObserver.onError(Status.FAILED_PRECONDITION.asRuntimeException(metadata));
       }
      
    3. Using oneof - we can also use oneof to send error response

    oneof response {
        SuccessResponse success_response = 1;
        ErrorResponse error_response = 2;
      }
    }
    

    client side:

    switch (response.getResponseCase()){
        case SUCCESS_RESPONSE:
            System.out.println("Success Response : " + response.getSuccessResponse().getResult());
            break;
        case ERROR_RESPONSE:
            System.out.println("Error Response : " + response.getErrorResponse().getErrorCode());
            break;
    }
    

    Check here for the detailed steps - https://www.vinsguru.com/grpc-error-handling/

提交回复
热议问题