2016-12-30 1 views
1

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 

Répondre

3

Il ne fonctionne pas parce que l'avenir qui ferait la récupération est pas celui que vous appelez Await.result() sur.

Depuis le Future's scaladoc, nous apprenons que recovercrée un nouveau futur qui gérera tout lanceable correspondant que ce futur pourrait contenir. S'il n'y a pas de correspondance, ou si ce futur contient un résultat valide, le nouveau futur contiendra le même résultat.

Ainsi, il est ce nouvel avenir vous êtes intéressé par

Essayez ceci:.

val result = futures1.map(x=>x+3) 
      .recover { 
       case e:Exception => 5 
      } 

Await.result(result,100 millis) 
+0

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? –

+0

.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