当前位置: 首页 > 面试题库 >

在将来可以将异常映射到其他异常类型?

查锦程
2023-03-14
问题内容

我正在使用Java 8的可完成的Future,并且希望能够处理将来抛出的异常并将其转换为其他异常

一旦发生异常,我尝试过的所有复合材料似乎都会短路。

例如,使用scala future,我可以执行以下操作:

scala.concurrent.Future<Object> translatedException = ask.recover(new Recover<Object>() {
            @Override public Object recover(final Throwable failure) throws Throwable {
                if (failure instanceof AskTimeoutException) {
                    throw new ApiException(failure);
                }

                throw failure;
            }
        }, actorSystem.dispatcher());

并且我希望能够在将来的Java复合块中模仿它。这可能吗?


问题答案:

您可以使用CompletableFuture#handle(BiFunction)。例如

CompletableFuture<String> ask = CompletableFuture.supplyAsync(() -> {
    throw new IndexOutOfBoundsException();
});
CompletableFuture<String> translatedException = ask.handle((r, e) -> {
    if (e != null) {
        if (e instanceof IndexOutOfBoundsException) {
            throw new IllegalArgumentException();
        }
        throw (RuntimeException) e; // this is sketchy, handle it differently, maybe by wrapping it in a RuntimeException
    }
    return r;
});

如果ask完成并带有异常,translatedException则将完成并带有潜在转换的异常。否则,它将具有相同的成功结果值。

关于我在代码中的注释,该handle方法期望未声明BiFunctionapply方法的方法抛出Throwable。因此,lambda主体本身无法抛出Throwable。参数e是类型,Throwable因此您不能throw直接使用它。你可以将它转换为RuntimeException,如果你知道它的那种类型的,或者你可以在一个包装它RuntimeExceptionthrow那个。



 类似资料:
  • 问题内容: 我有一个流程,在CXF客户端上我安装了拦截器,提供程序和异常映射程序。就我而言,我正在通过拦截器捕获来自客户端的不良响应,然后我想中止cxf总线链并引发故障。不幸的是我做不到,因为在每种情况下都只记录从拦截器抛出的异常,但是主要错误(错误的json格式)会传播到异常映射器。我想避免使用异常映射器,但是我不知道怎么做。我正在使用WebClient来实现这样的拦截器: 我读到我应该实现ja

  • 我有一个流程,在CXF客户机上,我在拦截器、提供者和异常映射器中有JAXR。在我的例子中,我通过截取程序捕捉到来自客户端的错误响应,然后我想中止cxf总线链并抛出一个错误。不幸的是,我无法做到这一点,因为在任何情况下,拦截器抛出的异常都只会被记录,但主要错误(错误的json格式)会传播到异常映射器。我想避免使用异常映射器,但我不知道如何避免。我使用WebClient实现如下拦截器: 我读到应该实现

  • 我正在努力使用Java Spring Hibernate,我正在尝试实现Oauth2,在通过@ManyToMany将表用户连接到角色时,我不断遇到错误。我已经阅读了所有关于我的问题的答案,无论我尝试什么,我仍然得到了一个组织。冬眠映射异常。 以下是我正在努力做的事情的全部细节。 数据库结构 角色。JAVA 使用者JAVA 依赖性 问题: org.springframework.beans.fact

  • 我收到http请求的响应,格式如下: 当我执行下面的代码时,我想将其映射到DTO中: DTO类别: 另一个类是: 当我尝试将FinalTestDt中的响应映射到类时,它会引发一个异常: WARN:org.springframework.http.converter.json.MappingJackson2HttpMessageConzer-无法评估类型[简单类型,类FinalTestDTO]的反序

  • 首先,我对这个问题太长表示最诚挚的歉意,但老实说,我不知道如何缩短它,因为每个部分都是一个特例。诚然,我可能对此视而不见,因为我已经把头撞到墙上好几天了,我开始绝望了。 我向所有通读这本书的人表示最大的尊重和感谢。 我希望能够通过使用Jersey ExceptionMapers将Shiro的AuthenticationException及其子类映射到JAX-RS响应,Jersey例外映射器是使用G

  • 几个月前我们开始使用Hazelcast。我们最近开始在生产环境中测试它,现在大约每周看到一次这个异常: 2020-02-11 12:10:00,084upport.invokeNoDataMemberInClusterException:无法找到调用的目标!分区所有者为空,但无法分配分区,因为集群中的所有节点都是精简成员。upport.java:467upport.java:406com.haze