是否有可能抛出异常,转移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
答案 0 :(得分:3)
是的,但可能不是你想的那样。根据{{3}},只有不 NonFatal
的错误才会转义Future.apply
。
try Success(body) catch { case NonFatal(e) => Failure(e) }
即。像VirtualMachineError
,OutOfMemoryError
,StackOverflowError
,ThreadDeath
,LinkageError
,InterruptedException
,ControlThrowable
等例外情况将被视为无效它们代表了一个致命的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为你管理所有的事情。