例如,一个 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,它将得到:If the client passes denominator = 0 , it will get :
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
logger.error ("Uncaught exception from grpc service");
没有被执行到!我也感到很奇怪。 - smallufonext.startCall(call, headers)
立即返回并在另一个线程中执行,最终我们会失去异常的堆栈信息。很遗憾我不知道目前是否有任何解决方法。 - Gladmir