W gRPC, jak dodać globalny przechwytywacz wyjątków, który przechwytuje wszystkie RuntimeException
i propaguje istotne informacje dla klienta?Jak dodać globalnego przechwytywacza wyjątków w serwerze gRPC?
na przykład metoda divide
może rzucić ArithmeticException
z komunikatem / by zero
. Na stronie serwera, mogę napisać:
@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();
}
Jeśli klient przechodzi mianownik = 0, to otrzymamy:
Exception in thread "main" io.grpc.StatusRuntimeException: UNKNOWN
a serwerem wyjścia
Exception while executing runnable io.grpc.in[email protected]62e95ade
java.lang.ArithmeticException:/by zero
Klient robi” wiem, co się dzieje.
Jeśli chcę przekazać / by zero
wiadomość do klienta, muszę zmodyfikować serwer: (jak opisano w tym 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())));
}
A jeśli klient wysyła mianownik = 0, to otrzymamy:
Exception in thread "main" io.grpc.StatusRuntimeException: INTERNAL:/by zero
Dobra, / by zero
jest przekazywana do klienta.
Ale problem polega na tym, że w prawdziwie korporacyjnym środowisku będzie dużo RuntimeException
s, i jeśli chcę przekazać wiadomości tego wyjątku do klienta, będę musiał spróbować złapać każdą metodę, która jest bardzo uciążliwa.
Czy istnieje jakiś globalny przechwytywacz, który przechwytuje każdą metodę, przechwytując RuntimeException
i wyzwala onError
i propaguje komunikat o błędzie do klienta? Tak, że nie mam do czynienia z RuntimeException
s w moim kodzie serwera.
Wielkie dzięki!
Uwaga:
<grpc.version>1.0.1</grpc.version>
com.google.protobuf:proton:3.1.0
io.grpc:protoc-gen-grpc-java:1.0.1
Niestety, to nie działa. Wiersz 'logger.error (" Uncaught exception from grpc service ");' nie został osiągnięty! Też jestem dziwny. – smallufo
Czy mógłbyś podzielić się swoim kodem? – Gladmir
kod tutaj, FYI: http://pastebin.com/a96suWB1 – smallufo