Как мне получить исключения, возникающие в Scala Future?

Я работал над своим ответом на Есть ли стандартная функция Scala для запуска блока с таймаутом? , и я столкнулся с проблемой, если исключение выбрасывается в Будущем.

  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)

Но если я генерирую исключение в моем блоке, оно не протекает, а проглатывается - так что следующее не срабатывает с «.. исключение не было создано»

intercept[Exception] {
    runWithTimeout(50) { throw new Exception("deliberate") }
}.getMessage should equal("deliberate")

Syserr имеет трассировку стека с сообщением

: caught java.lang.Exception: deliberate

, но я не могу найти, где в среде выполнения Scala печатается.

Помимо помещения f в другой блок, который улавливает исключения и распространяет их, если они выбрасываются, есть ли способ убедить awaitAll и / или Future бросить?

15
задан Community 23 May 2017 в 11:53
поделиться