在异常情况下将可完成的将来加入当前线程

问题描述

我有一个分派请求并异步等待响应的方法调用。收到响应后,它将触发回调以处理结果。

但是,如果某件事失败(错误的响应或其他失败),我想在调用线程中重新抛出异常。

dispatcher.dispatch(json)
.whenComplete((responseString,throwable) -> responses.handle(responseString));

在lambda表达式中重新抛出异常显然不起作用,因为它在不同的线程中。

dispatcher.dispatch(json)
.whenComplete((responseString,throwable) -> responses.handle(responseString))
.joinExceptionally(throwable -> throw throwable);

此呼叫也不能被阻止。换句话说,一旦可完成的未来异常完成而不会阻塞,是否有可能在调用线程中引发异常?

解决方法

基本上是不可能

您要异步处理请求,因此必须在另一个线程中处理请求。您还希望将异常抛出到调用线程中,因此必须将异常抛出到与先前需求一致的同一线程中(因为异常是通过调用堆栈传播的)。

通常,调度程序仅用于调度请求,不应用于处理异常。您最好使用CompletableFuture的内置功能来处理CompletableFuture.handle(BiFunction<? super T,Throwable,? extends U> fn)之类的例外。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...