【发布时间】:2017-02-09 08:43:52
【问题描述】:
在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();
}
如果客户端通过 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 消息传递给客户端,我必须将服务器修改为:
(如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())));
}
如果客户端发送 denominator = 0 ,它将得到:
Exception in thread "main" io.grpc.StatusRuntimeException: INTERNAL: / by zero
好的,/ by zero 已传递给客户端。
但问题是,在真正的企业环境中,会有很多RuntimeExceptions,如果我想将这些异常的消息传递给客户端,我必须尝试捕获每个方法,这很麻烦.
是否有任何全局拦截器可以拦截每个方法,捕获RuntimeException 并触发onError 并将错误消息传播给客户端?这样我就不必在我的服务器代码中处理RuntimeExceptions。
非常感谢!
注意:
<grpc.version>1.0.1</grpc.version>
com.google.protobuf:proton:3.1.0
io.grpc:protoc-gen-grpc-java:1.0.1
【问题讨论】:
标签: java protocol-buffers grpc grpc-java