Como obter exceções lançadas em um Scala Future?
Eu tenho trabalhado minha resposta paraxiste uma função Scala padrão para executar um bloco com um tempo limit e encontrar um problema se uma exceção for lançada em um futur
def runWithTimeout[T](timeoutMs: Long)(f: => T) : Option[T] = {
awaitAll(timeoutMs, future(f)).head.asInstanceOf[Option[T]]
}
De modo
runWithTimeout(50) { "result" } should equal (Some("result"))
runWithTimeout(50) { Thread.sleep(100); "result" } should equal (None)
Mas se eu lançar uma exceção no meu bloco, ela não vazará, mas será engolida - para que o seguinte falhe com "..nenhuma exceção foi lançada"
intercept[Exception] {
runWithTimeout(50) { throw new Exception("deliberate") }
}.getMessage should equal("deliberate")
Syserr possui um rastreamento de pilha com a mensagem
<function0>: caught java.lang.Exception: deliberate
mas não consigo encontrar o local do tempo de execução do Scala impress
lém de embrulhar f em outro bloco que captura exceções e as propaga se lançadas, existe alguma maneira de convencer waititAll e / ou Future a lança