我有两个可用的gRPCendpoint和一个ServerInterceptor,它应该在抛出异常时拦截异常。
gRPC服务定义如下:
@GrpcService
public class AccountsResource implements AccountsApiService {
@Inject
AccountsService accountsService;
@Override
public Uni<GetTppPlatformGroupIdResponse> getTppPlatformGroupId(Empty request) {
Context.Key<String> tppIamClientIdKey = Constant.TPP_IAM_CLIENT_ID_CONTEXT_KEY;
String tppIamClientId = tppIamClientIdKey.get(Context.current());
return Uni.createFrom().item(() -> accountsService.getTppPlatformGroupIdResponse(tppIamClientId))
.runSubscriptionOn(Infrastructure.getDefaultExecutor());
}
}
gRPC服务使用SmallRye Mutiny Responsive来处理请求。
其他帖子解释说,应该重写onHalfClose方法,并插入try/catch块来捕获自定义异常,然后映射到StatusRuntimeException gRPC可以使用的状态。我尝试了以下方法:
@ApplicationScoped
@GlobalInterceptor
public class ExceptionInterceptor implements ServerInterceptor {
private static final Logger LOG = LogManager.getLogger(ExceptionInterceptor.class);
@Override
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> serverCall, Metadata metadata, ServerCallHandler<ReqT, RespT> serverCallHandler) {
ServerCall.Listener<ReqT> listener = serverCallHandler.startCall(serverCall, metadata);
return new ExceptionHandlingServerCallListener<>(listener, serverCall, metadata);
}
private class ExceptionHandlingServerCallListener<ReqT, RespT> extends ForwardingServerCallListener.SimpleForwardingServerCallListener<ReqT> {
private ServerCall<ReqT, RespT> serverCall;
private Metadata metadata;
ExceptionHandlingServerCallListener(ServerCall.Listener<ReqT> listener, ServerCall<ReqT, RespT> serverCall, Metadata metadata) {
super(listener);
this.serverCall = serverCall;
this.metadata = metadata;
}
@Override
public void onHalfClose() {
try {
super.onHalfClose();
} catch (Throwable ex) {
handleException(ex, serverCall, metadata);
}
}
@Override
public void onReady() {
try {
super.onReady();
} catch (Throwable ex) {
handleException(ex, serverCall, metadata);
}
}
}
handleException方法将Throwable映射到StatusRuntimeException,并抛出StatusRuntimeException。
到目前为止还不错,并且在运行应用程序并模拟自定义异常时,ExceptionInterceptor确实输入了onHalf关闭
方法。但是,即使抛出了异常,它也不会进入catch块。此错误消息被记录到控制台:
2022-01-24 12:07:36232警告[io.qua.grp.run.ServerCalls](executor-thread-0)gRPC服务引发了StatusRuntimeException以外的异常
如何修复此问题?
使用此https://github.com/grpc/grpc-kotlin/issues/141,它位于kotlin中,但可以适应java。
我正在尝试使用Quarkus构建一个小型REST服务。我正在使用Hibernate和PostgreSQL数据库。它在所有好的情况下都非常有效。但是当出现Hibernate异常时,比如,我无法以正常方式捕获它们。异常被包装为其他异常和。因此,可以通过使用 存储库 资源 由于这个问题,也无法为HibernateException添加一个。是否有人遇到过类似的问题,或者我的代码存在一般性问题?我正在使用
我的用它的作用域启动coroutine 我的只处理一些逻辑,在本例中是某种验证器 然后我的只处理网络层/本地层 以下是我得到的错误日志: 错误直接指向显式的语句。
问题内容: 为什么Java中的某些异常未被捕获?这是代码由于没有处理的异常而完全失败。(Java版本1.4)。 我得到一个 但这有效 我懂了 我以为捕获异常会捕获所有异常?如何捕获Java中的所有异常? 问题答案: 因为某些异常不是源自-例如和。 基本上,类型层次结构是: 只能抛出派生类,因此,如果您抓住,那实际上就可以抓住一切。 ,以及任何异常,从获得 其他 比那些源自数作为 检查的异常 -他们
我对Java线程、Runnable等相当陌生。因此,我想知道为什么下面的代码没有捕获异常? 阅读有没有一种方法可以使Runnable的run()引发异常,我收集到: "...如果您的run()方法确实是Thread的目标,则抛出异常是没有意义的,因为它是不可观察的;抛出异常与不抛出异常(无)具有相同的效果。"(@erickson) 我应该检查Runnable.run()方法中的异常。 为什么会这样
为什么Java中的一些异常不被捕获?这是完全失败的代码,有一个未处理的异常。(Java版本1.4)。 我在线程“main”java中得到了一个 但这行得通 我在java中没有发现任何方法错误。lang.NoSuchMethodError: 我以为捕获异常会捕获所有异常?如何捕获java中的所有异常?
我正在尝试创建一个过滤器来处理异常(请参见在JSF中处理未捕获的异常) 我在日志中看到错误: 我做错了什么?