【发布时间】:2018-03-24 19:30:06
【问题描述】:
我遇到过大量使用 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 最佳实践,即将异常向上传播到能够有意义地处理它的最近的代码块。目前我无法引用此最佳实践的权威来源,也许有人可以在 cmets 中指出它。在这些示例中,lambda 中的代码太低级,无法有意义地处理异常。
我的问题是,除了这个烂摊子还有什么替代品?
根据 SO 规则,请将您的答案限制在工作代码中,尽管我不介意在 cmets 中提出一些更大的想法......例如可能对 Java 语言的增强以及如何通过 JCP 发送提案(如果尚不存在)。
【问题讨论】:
-
您必须捕获异常,因为大多数真正有用的 Java8 流方法,例如 map()、filter() 等,不采用抛出异常(传播)的 lambda。
标签: java lambda exception-handling stream java-stream