如何在ListeningExecutorService中抛出异常?

时间:2017-12-21 12:01:47

标签: guava threadpoolexecutor

我在项目中使用了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。

如何获取详细错误消息?

1 个答案:

答案 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)] 方法中抛出异常。