Je m'attends à ce que le code suivant génère la valeur 5 car j'ai écrit recover pour gérer l'exception et retourner 5. Mais je vois toujours l'exception dans IntelliJ. Quelle est l'erreur ici?impossible de récupérer dans Future - scala
import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.{Failure, Success, Try}
import scala.concurrent.duration._
import scala.language.postfixOps
object ConcurrencyExample extends App {
val time = System.currentTimeMillis()
val futures1: Future[Int] = Future {
println("in Future.. sleeping")
Thread.sleep(10)
println("awakein future")
throw new Exception("future failed")
1
}
val result = futures1.map(x=>x+3)
result recover {
case e:Exception => 5
}
result onComplete{
case Success(v)=>println("result is "+v)
case Failure(e) =>println("failed result:"+e)
}
Await.result(result,100 millis)
}
résultat
in Future.. sleeping
awakein future
Exception in thread "main" LegacyException: future failed
Merci. Un doute - la carte est appelée sur le futur1. Ma compréhension est que la carte est appelée seulement quand le futur est réussi. Si le futur ne réussit pas, .recover sera appelé sur futures1? Je ne suis pas familier avec la syntaxe. Vous appelez futures1.map mais pas futures1.recover. Est-ce une sorte d'OrElse? –
.map vous renverra un nouvel avenir qui a échoué ou qui applique l'opération passée si 'futures1' réussit. Les objets de Scala sont généralement immuables, et toute méthode qui semble modifier quelque chose vous renvoie une nouvelle instance avec les modifications que vous voulez. Par conséquent, ici, recover fonctionnera lorsque 'futures1' échoue. – Shastick