如何捕获从lambda抛出的异常

时间:2017-10-25 20:00:45

标签: java android java-8

我可能在这里遗漏了一些明显的东西,但是如何抓住我从lambda中重新抛出的IOException

   Future<Response<R>> futureResp = pool.submit(() -> {
        Response<R> res;
        try {
            res = call.execute();
        } catch (IOException e) {
            throw new IOException(e);
        }
        return res;
    });

整个方法看起来像这样:

@Override
public RetrofitResponse<R> adapt(Call<R> call) {
    if (networkUtil.isOnline( ctx )) {
        ExecutorService pool = Executors.newFixedThreadPool(1);

        Future<Response<R>> futureResp = pool.submit(() -> {
            Response<R> res;
            try {
                res = call.execute();
            } catch (IOException e) {
                throw new IOException(e);
            }
            return res;
        });

        Response<R> resp;
        try {
            resp = futureResp.get();
        } catch (Exception e) {
            e.printStackTrace();
            return new RetrofitResponse<>( ErrorStatus.PROCESSING_ERROR, e.getMessage() );
        }
        if (resp != null) {
            return new RetrofitResponse<>( new ApiResponse<>(resp) );
        } else {
            return new RetrofitResponse<>( ErrorStatus.PROCESSING_ERROR, "Response is null" );
        }
    } else {
        return new RetrofitResponse<>( ErrorStatus.NETWORK_ERROR, "No internet network detected!" );
    }

}

我基本上希望将错误包装在一个自定义对象中,该对象保持可能的错误状态,这些错误不一定与缺少网络连接或http错误有关。

在另一个try-catch块中扭曲此块不起作用,因为ide表示没有要捕获的IOException。

3 个答案:

答案 0 :(得分:3)

这与lambda表达式完全没有关系。因此,您不需要捕获并重新抛出“来自lambda”的异常;你可以简单地提交你的工作,如

Future<Response<R>> futureResp = pool.submit(() -> call.execute());

关键是这将调用submit(Callable)Callable接口允许抛出已检查的异常。并且Future.get()表示:

  

抛出:

     

...
  ExecutionException - 如果计算引发异常

因此,当您在catch(ExecutionException)来电get()时,cause将被抛出IOException,如果有的话。

答案 1 :(得分:1)

您需要捕获原始Exception并将其作为UncheckedException投掷,可能就像您之前延伸的那样,并保留原始异常作为其原因。

然后抓住这个UncheckedException,如果需要,从中挖掘原因。

答案 2 :(得分:1)

您需要将您的错误重新抛出为UncheckedException

  catch(IOException e) {
      throw new RuntimeException(e);
  }

或者扩展RuntimeException并抛出一个自定义的。

您将在future.get()

中收到错误