【发布时间】:2015-12-14 23:31:14
【问题描述】:
给定以下代码:
import scala.concurrent.ExecutionContext
import java.util.concurrent.Executors
val ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(1))
val f = Future[Unit](throw new java.lang.InternalError())(ec)
未来f 永远不会完成。 f.value 始终是 None。
已修复 scala-2.10 中的一个已知错误:
http://mandubian.com/2013/02/22/scala-future-fatal-exception
https://issues.scala-lang.org/browse/SI-7029
我正在使用 scala-2.11。
错误报告中的示例使用了 NotImplementedErorr,它由 Future 正确处理,并且会完成。但是,如果我在上面的示例中使用 InternalError,那么 Future 永远不会完成。无论我使用 ExecutionContext.global、Executors.newSingleThreadExecutor 还是 Executors.newFixedThreadPool,都是如此。
我可以在 Future 的主体中捕获 Throwable 并重新抛出它,但我知道 Future 会正确处理异常,但这是一个糟糕的解决方案。
这是一个已知问题吗?预期的行为?我有哪些选择可以让我的 Futures 行为正常?
【问题讨论】:
-
我找不到任何关于这是故意的文档,但这种行为似乎只发生在 Throwable 子类型本身不是 Exception 的子类型
标签: scala