我可能在这里遗漏了一些明显的东西,但是如何抓住我从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。
答案 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()
中收到错误