Я обработал свой ответ на Существует ли стандартная функция 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)
Но если я выбрасываю исключение в своем блоке, оно не протекает, а проглатывается - так что следующее не получается с "..но исключение не было выдано"
intercept[Exception] {
runWithTimeout(50) { throw new Exception("deliberate") }
}.getMessage should equal("deliberate")
Syserr имеет трассировку стека с сообщением
<function0>: caught java.lang.Exception: deliberate
но я не могу найти, где во время выполнения Scala напечатано.
Помимо переноса f в другой блок, который перехватывает исключения и распространяет их, если выброшены, есть ли способ убедить awaitAll и / или Future бросить?