Я работал над своим ответом на Существует ли стандартная функция 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 имеет трассировку стека с сообщением
<function0>: caught java.lang.Exception: deliberate
но я не могу найти, где в Scala время выполнения, которое печатается.
Помимо обертывания f в другом блоке, который ловит исключения и распространяет их при броске, есть ли способ убедить awaitAll и/или Future бросить?