我在项目中使用了guava的ListeningExecutorService,对异常处理感到困惑。
我使用线程池,向其提交任务,并为listenableFuture设置超时,并为其添加回调。
final ListeningExecutorService threadPool = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool());
Futures.addCallback(listenableFuture, new FutureCallback<**>() {
@Override
public void onSuccess(@Nullable ** data) {
xxxxxxx;
}
public void onFailure(Throwable t) {
xxxxxxxxxx;
if (t instanceof CancellationException) {
throw new QueryException("yyyy");
} else {
throw new QueryException("zzzzz");
}
}
});
我无法在回调中捕获异常。所以我使用另一个ListenableFuture来获取异常
ListenableFuture allFutures = Futures.allAsList(allFuturesList);
try {
allFutures.get();
} catch (CancellationException ce) {
throw new QueryException("");
} catch (InterruptedException t) {
throw new QueryException("");
} catch (ExecutionException e) {
Throwable t = e.getCause();
if (t instanceof QueryException)
throw (QueryException) t;
else
throw new QueryException();
} catch (QueryException qe) {
throw qe;
} catch (Exception e) {
throw new QueryException();
} finally {
}
但是当回调抛出一个QueryException时,allFutures无法捕获它,allFutures只能捕获一个没有详细错误消息的CancellationException。
如何获取详细错误消息?
答案 0 :(得分:1)
[17 13 9 5
没有做您期望的事情来自Javadoc :(重点是来自我)
取消此未来会尝试取消所有组件期货,如果任何提供的期货失败或被取消,这个也是。
您应该做的是创建自己的聚合未来。您可以将代码基于Guava自己的内部机制。有关详细信息,请参阅the source code。
无论如何,不会在length = int(np.hypot(x1-x0, y1-y0))
xx, yy = np.linspace(x0, x1, length), np.linspace(y0, y1, length)
zi = arr[xx.astype(np.int), yy.astype(np.int)]
方法中抛出异常。