返回Future.failed(Exception)和抛出异常之间的区别

时间:2015-07-02 20:32:54

标签: scala

在Scala中,返回Future.failed(new Exception("message!"))throw new Exception("message!")之间的区别是什么?

假设这是在一个返回Future[Unit]的函数中发生的,而调用函数是这样的:

someFunction onFailure {
  case ex: Exception => log("Some exception was thrown")
}

是否优先选择其中一个或每个特定用例?

1 个答案:

答案 0 :(得分:10)

调用Future { throw ex }Future.failed(ex)会产生相同的结果。但是,使用Future.failed会更有效。如果我们从Future.apply(来自here in the source)查看此代码段:

promise complete {
    try Success(body) catch { case NonFatal(e) => Failure(e) }
}

我们注意到(正如可以预料的那样),这依赖于try...catch块。与普通代码相比,这些已知会带来很大的开销。 Future.failed方法本质上是一个快捷方式,而不必承担实际抛出异常的成本。