【发布时间】:2020-07-13 00:08:58
【问题描述】:
我有以下几点:
cflst.addAll(asList(
supplyAsync(() -> mytask.getComp("comp"), executor)
.thenAccept(comp -> helper.mapStuff(comp))
.exceptionally(ex -> {
sout("Some Error"); // Never print
return null;
})
.handle((comp, throwable) -> {
sout("Error here" + comp); //always prints regarless of exception
return null;
}),
...
));
CompletableFuture.allOf(cflst.toArray(new CompletableFuture[0])).join();
还有MyTask.getComp方法
CompX getComp(String id) {
client.getData(id);
}
Client.getData()
SomeX getData(String id) {
throw new MyCustomRuntimeException("Blew Up");
}
我认为当myComp 方法中抛出异常时,exceptionally() 块得到了异常。但似乎没有。
另外,不管有什么异常,handle() 总是被调用 !?!?!
我希望能够捕获任何异常并根据需要进行处理(重新抛出或吞下)。
更新
当我在getComp 方法中捕获异常然后重新抛出它时,exceptionally 块被执行。但不知道为什么当异常在getData 方法向下抛出一个级别时它没有被执行?
【问题讨论】:
-
getCommp()是您帖子中的错字吗? (始终复制/粘贴代码,切勿重新输入) -
是的。修好了。
-
handle()总是被调用不是问题,这是可以预料的;它应该打印“此处的错误:null”,因为应该事先调用exceptionally()并将结果设置为null。问题是为什么exceptionally中的消息没有输出;sout()是什么,也许它以某种方式抑制了它? -
我看到你已经接受了一个答案,到底是什么问题?答案没有解释为什么你的
exceptionally()函数没有被执行…… -
关于“从不打印”问题。我在 Android 中看到了类似的问题,在 .exceptionally 中有一个 Toast。在 UI 线程上运行的块内的相同 Toast 工作正常。通过检查日志,当我检查它时,异常总是出现在不同的线程上。它并不像看起来那么简单,但是因为 Toast 似乎无声地崩溃并且在它之后没有异常执行的代码,但似乎没有其他执行受到影响,而且在 UI 中更新 TextView 异常工作正常。尚未深入了解,但好奇您是否找到了“从不打印”问题的根源?
标签: java multithreading asynchronous exception completable-future