Мне понравилось это звучание, но FutureActor является частным и достаточно сложным, чтобы воспроизводить его было бы волосатым.

отал над моим ответомСуществует ли стандартная функция 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)

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

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

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

<function0>: caught java.lang.Exception: deliberate

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

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

Ответы на вопрос(3)

Ваш ответ на вопрос