在 gRPC 中,如何添加一个全局异常拦截器来拦截任何RuntimeException
并向客户端传播有意义的信息?
例如,一个方法可能会divide
抛出message 。在服务器端,我可以写: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();
}
如果客户端通过 denominator = 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())));
}
如果客户端发送 denominator = 0 ,它将得到:
Exception in thread "main" io.grpc.StatusRuntimeException: INTERNAL: / by zero
好,/ by zero
传给客户。
但问题是,在真正的企业环境中,会有很多RuntimeException
s ,如果我想把这些异常的消息传递给客户端,我必须尝试每一个方法来捕获,这非常麻烦。
是否有任何全局拦截器可以拦截每个方法,捕获RuntimeException
并触发onError
并将错误消息传播给客户端?这样我就不必RuntimeException
在我的服务器代码中处理 s 了。
非常感谢 !
笔记 :
<grpc.version>1.0.1</grpc.version>
com.google.protobuf:proton:3.1.0
io.grpc:protoc-gen-grpc-java:1.0.1