与CompleteableFuture一起使用的异常处理方法

时间:2018-07-17 13:47:50

标签: java completable-future

我有一些签名如下的静态方法:

public static void produceMessages() throws AeventException,
    ResourceUnavailableException {...}

public static void doFunnyStuff(SolrIndex solrIndex) throws DifferentException {...}

我想将所有这些方法包装在WebApplicationException的{​​{1}}中,以便可以与RuntimeException一起使用。

到目前为止,是这样的:

CompletableFuture.runAsync()

但是我仍然无法使用这些方法,

private void handleExceptions(Runnable r) {
    try {
        r.run();
    } catch (Exception e) {
        log.error("Exception occured", e);
        throw new WebApplicationException(
            Response.status(Response.Status.INTERNAL_SERVER_ERROR)
                .entity("Internal error occurred").build());
    }
}

不幸的是,这仍然提示我在CompletableFuture.runAsync(() -> { handleExceptions(() -> PromotionEventProducer.producePromotionUpdateMessages()); }); 块内使用try / catch。实现这种将所有exceptons转换为可以与runAsync一起使用的运行时异常的方法的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

您不能从lambda表达式中引发已检查的异常,相同的规则适用于handleExceptions(() -> ...),它本身就是lamda表达式。

但是,您可以定义一个类似于Runnable但会引发异常的接口。

interface RunnableWrapper {
    void run() throws Exception;
}

然后,您可以定义一个方法,将检查的专有名词转换为运行时异常。

public void handleException(RunnableWrapper r) {
    try {
        r.run();
    }
    catch(Exception e) {
        throw new CompletionException(e);
    }
}

然后,您的最终声明将如下所示,其中foo是一种引发检查后的排除的方法。

CompletableFuture.runAsync(() -> handleException(this::foo));