Как в gRPC добавить глобальный перехватчик исключений, который перехватывает любые RuntimeException
и передает значимую информацию клиенту?
например, метод divide
может выдавать ArithmeticException
с сообщением / by zero
. На стороне сервера я могу написать:
@Override
public void divide(DivideRequest request, StreamObserver<DivideResponse> responseObserver) {
int dom = request.getDenominator();
int num = request.getNumerator();
double result = num / dom;
responseObserver.onNext(DivideResponse.newBuilder().setValue(result).build());
responseObserver.onCompleted();
}
Если клиент передаст знаменатель = 0, он получит:
Exception in thread "main" io.grpc.StatusRuntimeException: UNKNOWN
И сервер выводит
Exception while executing runnable io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$2@62e95ade
java.lang.ArithmeticException: / by zero
Клиент не знает, что происходит.
Если я хочу передать сообщение / by zero
клиенту, мне нужно изменить сервер на: (как описано в этом вопросе < / а>)
try {
double result = num / dom;
responseObserver.onNext(DivideResponse.newBuilder().setValue(result).build());
responseObserver.onCompleted();
} catch (Exception e) {
logger.error("onError : {}" , e.getMessage());
responseObserver.onError(new StatusRuntimeException(Status.INTERNAL.withDescription(e.getMessage())));
}
И если клиент отправит знаменатель = 0, он получит:
Exception in thread "main" io.grpc.StatusRuntimeException: INTERNAL: / by zero
Хорошо, / by zero
передан клиенту.
Но проблема в том, что в действительно корпоративной среде будет много RuntimeException
, и если я хочу передать эти сообщения об исключении клиенту, мне придется попробовать поймать каждый метод, что очень громоздко.
Есть ли какой-либо глобальный перехватчик, который перехватывает каждый метод, перехватывает RuntimeException
и запускает onError
и передает сообщение об ошибке клиенту? Так что мне не нужно иметь дело с RuntimeException
в моем серверном коде.
Большое спасибо !
Примечание :
<grpc.version>1.0.1</grpc.version>
com.google.protobuf:proton:3.1.0
io.grpc:protoc-gen-grpc-java:1.0.1