我有一些签名如下的静态方法:
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
一起使用的运行时异常的方法的最佳方法是什么?
答案 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));