处理未来#获取和中断异常声纳java:S2142
在我继承的一些遗留代码中,有一个片段与此类似处理未来#获取和中断异常声纳java:S2142,java,concurrency,interrupted-exception,Java,Concurrency,Interrupted Exception,在我继承的一些遗留代码中,有一个片段与此类似 List<Callable<String>> callableStrings = Arrays.asList("one", "two", "three").stream() .map(s -> (Callable<String>) () -> s) .collect(Collectors.toList()); List<String> results =
List<Callable<String>> callableStrings = Arrays.asList("one", "two", "three").stream()
.map(s -> (Callable<String>) () -> s)
.collect(Collectors.toList());
List<String> results =
someExecutorService.invokeAll(callableStrings).stream()
.map(
future -> {
try {
return future.get();
} catch (ExecutionException | InterruptedException e) {
LOG.info("Unexpected Exception encountered while fetching result", e);
return null;
}
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
List callableStrings=Arrays.asList(“一”、“二”、“三”).stream()
.map(s->(可调用)(->s)
.collect(Collectors.toList());
列出结果=
someExecutorService.invokeAll(callableStrings.stream)()
.地图(
未来->{
试一试{
返回future.get();
}捕获(ExecutionException | InterruptedException e){
LOG.info(“获取结果时遇到意外异常”,e);
返回null;
}
})
.filter(对象::非空)
.collect(Collectors.toList());
我实际上是在处理一些更重的计算,而不是可调用的。Sonar强调了捕获(ExecutionException | InterruptedException e)
是一个问题,建议您始终重新搜索InterruptedException
这段代码的目的似乎是过滤掉任何有问题的繁重计算,只返回那些成功的。对于上下文,此代码是作为我的应用程序正在处理的HTTP请求的结果调用的。如果InterruptedException
被允许一直传播到顶部,那么客户端将得到错误响应,而不是看到成功结果的列表
在处理InterruptedException
fromFuture\get
中的InterruptedException
时,可以找到许多不同类型的信息。大多数看起来非常清晰和可靠的建议都是在处理这样一种情况:您已经实现了类似于Runnable
的东西,并且正在从该类中调用Future\get
这个答案表明,如果我在上面的代码中看到抛出的InterruptedException
,则表明处理HTTP请求的线程已被中断,而不是将来运行的线程。对吗
我的问题是:
- 我应该关注声纳警告吗?如果是的话,保持代码不变会发生什么不好的事情
- 应该如何重构代码以进行改进
这是我继承的代码。我确信声纳告诉我要做正确的事。我试图从这个问题中得到的是更深入地理解当抛出中断异常时会发生什么,以及我应该如何应对它(如果有的话)。是HTTP请求处理线程被中断了吗?如果是这样的话,很明显我应该让异常传播。因为所有的未来都应该在invokeAll
返回时完成,InterruptedException
应该永远不会发生。因此,处理永远不会发生的异常的正确方法是catch(InterruptedException ex){throw new AssertionError(ex);}
Thank you@Holger。这显然是真的。这是我继承的代码。我确信声纳告诉我要做正确的事。我试图从这个问题中得到的是更深入地理解当抛出中断异常时会发生什么,以及我应该如何应对它(如果有的话)。是HTTP请求处理线程被中断了吗?如果是这样的话,很明显我应该让异常传播。因为所有的未来都应该在invokeAll
返回时完成,InterruptedException
应该永远不会发生。因此,处理永远不会发生的异常的正确方法是catch(InterruptedException ex){throw new AssertionError(ex);}
Thank you@Holger。这显然是正确的。