В 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.in[email protected]62e95ade
java.lang.ArithmeticException: / by zero
Клиент не знает, что происходит.
Если я хочу передать сообщение / by zero
клиенту, мне нужно изменить сервер на:
(как описано в этом question)
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