加入可完成的未来到当前线程的异常

Join completable future to current thread on exception

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

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

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

在 lambda 表达式中重新抛出异常显然是行不通的,因为它在不同的线程中。所以类似于

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

这个调用也不能阻塞。换句话说,一旦可完成的未来异常完成,是否可以在调用线程中抛出异常而不阻塞?

这基本上不可能

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

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