Я работал над своим ответом на Есть ли стандартная функция 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 бросить?