这是scaladoc for andThen的一个例子:
val f = Future { 5 }
f andThen {
case r => sys.error("runtime exception")
} andThen {
case Failure(t) => println(t)
case Success(v) => println(v)
}
无论未来最终是什么,行case r => sys.error("runtime exception")
都不会抛出异常?对我来说真的没有任何意义,但也许我错过了什么。
答案 0 :(得分:3)
是的,无论未来到底是什么,它都会引发异常。
抛出异常可以作为抛出异常的线程的消息。
一般来说,
然后用于在给定的未来完成之后执行一些副作用代码,并且之后的操作的结果类型是和原始未来相同的结果。因此,您可以模式匹配并期望与原始未来相同的结果。
在你的情况下,副作用操作是抛出异常,但它可以是任何其他有用的副作用操作,如写入文件,关闭资源等
以下是标准Scala库中andThen
的实现。
andThen
用于在调用它的未来完成后运行一些副作用操作,但需要注意的是整个操作的结果类型将是未来原始未来结果。< / p>
def andThen[U](pf: PartialFunction[Try[T], U])(implicit executor: ExecutionContext): Future[T] = {
val p = Promise[T]()
onComplete {
case r => try pf.applyOrElse[Try[T], Any](r, Predef.conforms[Try[T]]) finally p complete r
}
p.future
}
注意andThen
操作后,将返回原始未来的结果。
正如@Yuval Itzchakov所说,您可以使用它将异常抛给主线程。但通常它会在未来完成后用于副作用。
答案 1 :(得分:1)
线
case r => sys.error("runtime exception")
不会抛出 无论未来最终是什么,例外?
是的,确实如此。但有一件事你需要记住,在Future
内抛出的异常不会在主执行线程上自动重新抛出,它们需要从主线程处理和重新抛出,以便程序终止。 / p>
所有andThen
允许你做的是按顺序执行一些副作用方法,并继续构成期货。有许多事情可能需要引起注意,例如处理开放资源。如果你想要的只是组成期货,我会选择Future.map
。