我也遇到过,并有助于其使用Java8流和lambda表达式广泛的项目。该代码是充斥着这样的块:
... some other code ... -> {
try {
... some more code ...
}
catch(SomeException e) {
throw new RuntimeException(e);
}
} ...
或可替代
private void someMethodWhichWillBeCalledInALambda(...) {
try {
... some code ...
}
catch(SomeException e) {
throw new RuntimeException(e);
}
}
除了乱扔垃圾这些额外的try / catch块的代码,我们也失去了做适当的异常处理的堆栈(在使用lambda表达式代码的用户)的能力。
Lambda表达式突破传播异常堆栈向上到能够有意义处理它的代码最接近的块的长期Java的最佳实践。我不能在此刻所报的这个最佳实践的权威来源,也许有人可以指向它在评论中。在这些例子中,在lambda代码太低级有意义处理异常。
我的问题是,什么是替代这个烂摊子?
在与SO规则保持一致,请限制你的答案只有工作的代码,但我不会在一些较大的想法......比如可能增强了Java语言,以及如何得到的建议通过JCP把评论介意,如果一个已经不存在。
我知道这是一种老问题,但是我目前解决这种方式。我不知道这是否是最好的方法,但它为我工作
final Set<MyException> exceptionHolder = ConcurrentHashMap.newKeySet();
List<fooType> foos = something.stream().parallel().map(someStuff -> {
try{
return foo();
} catch (MyException e) {
exceptionHolder.add(e);
return null;
}
}).collect(Collectors.toList());
if (exceptionHolder.isEmpty()) {
return foos;
} else {
throw exceptionHolder.stream().findFirst().get();
}