传递scala.concurrent.Future的异常?

时间:2015-07-07 18:43:20

标签: scala exception future

是否有可能抛出异常,转移Future上下文?

由于Future"评估"一旦定义:

Future的定义是否有可能抛出异常,通过Future上下文?

scala> Future { Thread.sleep(3000); println("3 seconds elapsed"); 100 }
res2: scala.concurrent.Future[Int] = 
     scala.concurrent.impl.Promise$DefaultPromise@56113384

scala> 3 seconds elapsed

我无法想出这样的例子。

scala> Future { throw new Exception("Foo!") }
res3: scala.concurrent.Future[Nothing] = 
  scala.concurrent.impl.Promise$DefaultPromise@47a86fbb

3 个答案:

答案 0 :(得分:3)

是的,但可能不是你想的那样。根据{{​​3}},只有 NonFatal的错误才会转义Future.apply

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

即。像VirtualMachineErrorOutOfMemoryErrorStackOverflowErrorThreadDeathLinkageErrorInterruptedExceptionControlThrowable等例外情况将被视为无效它们代表了一个致命的JVM错误,你将无法处理它。

答案 1 :(得分:0)

除了定义计算之外,未来本身什么都不做。它恰好是您正在使用其中一个构造函数(或应用方法),默认情况下,它会立即开始运行计算。异常处理和并发的混合是scala.concurrent.Future不明显的问题之一。更好的替代方法可能是使用scalaz.concurrent.Task,它将错误处理与显式并发相结合。

答案 2 :(得分:0)

为什么你想从未来抛出错误?

Future是一个monad,可以在处理延迟和异常时处理它。

如果你看一下Future实现,它看起来如下所示,

trait Future[T] {    def onComplete(callback: Try[T] => Unit)(implicit exe..) }

因此,只要您的未来完成且值可用,您的回调方法将被调用并返回单位。

如果你看到回调方法,你会发现你的结果会成功或错误,并尝试[T] woluld为你管理所有的事情。