我一直在處理我對Is there a standard Scala function for running a block with a timeout?的回答,並且如果在Future中引發異常,則會遇到問題。如何獲取Scala Future中拋出的異常?
def runWithTimeout[T](timeoutMs: Long)(f: => T) : Option[T] = {
awaitAll(timeoutMs, future(f)).head.asInstanceOf[Option[T]]
}
這樣
runWithTimeout(50) { "result" } should equal (Some("result"))
runWithTimeout(50) { Thread.sleep(100); "result" } should equal (None)
但是,如果我可以把我的塊中的例外,但不得泄漏,但吞噬 - 這樣下失敗,「..no拋出異常」
intercept[Exception] {
runWithTimeout(50) { throw new Exception("deliberate") }
}.getMessage should equal("deliberate")
SYSERR具有與消息
<function0>: caught java.lang.Exception: deliberate
棧跟蹤
但我無法找到打印的Scala運行時的哪個位置。
除了將f封裝在另一個捕獲異常的塊中並在拋出異常時傳播它們,有沒有什麼辦法可以說服awaitAll和/或Future拋出?
它可能是打印,因爲它被認爲是傳遞給線程的[UncaughtExceptionHandler的] (http://download.oracle.com/javase/6/docs/api/java/lang/Thread.UncaughtExceptionHandler.html)。你可以設置你自己的處理程序,但是這仍然不允許你在另一個線程中拋出異常。 – 2011-06-03 16:36:12
看看Fingales期貨(https://github.com/twitter/finagle),搜索「Timeout」和Akka http://akka.io/docs/akka/1.1.2/scala/futures.html – oluies 2011-06-03 17:48:07