问题描述
我有一个分派请求并异步等待响应的方法调用。收到响应后,它将触发回调以处理结果。
但是,如果某件事失败(错误的响应或其他失败),我想在调用线程中重新抛出异常。
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)
之类的例外。