我有一个方法,它可能抛出异常取决于传递的值:
private def transform(in: Int): Future[Boolean] = in match {
case i if i < 0 => Future.successful(true)
case i if i > 0 => Future.successful(false)
case i if i == 0 => throw new IllegalStateException()
}第二种方法是将上述方法并行地应用于列表中的各个元素。
def massTransform(ints: List[Int])(implicit ex: ExecutionContext):
Future[List[Boolean]] = {
Future.traverse(ints){
i => transform(i).recover {
case e: IllegalStateException => false
}
}
}我预计,恢复将捕获IllegalStateException并返回未来(False)。但是我的代码在IllegalStateException中失败了
发布于 2022-07-05 16:00:14
问题是您正在抛出一个Future之外。您需要将异常包装在Future中,否则所发生的情况是该方法本身抛出而不是返回失败的Future。您可以将方法简化如下:
def transform(in: Int): Future[Boolean] =
if (in == 0) Future.failed(new IllegalStateException)
else Future.successful(in < 0)您可以使用这个代码这里是Scastie。
这看起来像是你实际逻辑的简化。如果情况不是这样(或不完全),我建议删除不必要的Future嵌套,如下所示:
def transform(in: Int): Boolean =
if (in == 0) throw new IllegalStateException else in < 0
def massTransform(
ints: List[Int]
)(implicit ex: ExecutionContext): Future[List[Boolean]] =
Future(ints.map { i =>
try transform(i)
catch { case e: IllegalStateException => false }
})注意transform方法抛出和异常处理是如何在Future构造函数中完成的。
您也可以使用这个第二个版本的论斯卡斯蒂。
发布于 2022-07-05 15:15:58
transform的实现不正确,应该是:
case i if i == 0 => Future.failed(new IllegalStateException())
我想这是一个简化的例子,因为这段代码实际上并不能并行计算,除非transform实际上在执行IO或相当昂贵的计算。
https://stackoverflow.com/questions/72871482
复制相似问题