Comment puis-je gérer si un futur retourne une exception échouée?
Le scénario est que mon code appelle Est-ce que quelqu'un a des suggestions de la façon dont je ferais cela? P> mise à jour:
Je ne pense pas que j'ai fait cela clair avec la question originale, mais la raison pour laquelle je circule la valeur est que je ne veux pas explicitement attendre l'un des futurs de mon code et que je ne veux donc pas Pour utiliser fule.onComplete {} pour résoudre la valeur. P> Mise à jour 2:
Une autre chose qui pourrait ne pas être claire est que si elle jette une exception, je veux appeler une autre méthode. Je ne veux pas que cela gère simplement l'exception, il va enregistrer l'exception, puis appeler une autre méthode dont la valeur de retour est du même type que GetValue (). P> P> getvalue () code>, mappe le résultat sur VerifyValue () code>, puis je veux pouvoir gérer le cas où le résultat de getvalue () est futur.failié (nouvelle exception ("message")) code>. Cependant, lorsque je courois cela, si le résultat de GetValue () est un avenir échoué, il jette simplement l'exception plutôt que de la manipuler. P>
3 Réponses :
import scala.util.{Success, Failure}
f.onComplete {
case Success(value) => // do sth with value
case Failure(error) => // do sth with error
}
You can use onComplete in your method(), see link below for other options as well: http://www.scala-lang.org/api/2.9.3/scala/concurrent/Future.html
Utiliser récupérer ou récupérerwith est appelé quand futur échoue avec une exception. Dans le bloc de récupération, vous pouvez donner la valeur alternative. P> Récupérer code> ou Recoverwith code> Remecwith code> Contrairement à la récupération code> prend l'avenir de quelque chose P> getValue().recover { case th =>
//based on the exception type do something here
defaultValue //returning some default value on failure
}
Si j'essaie de le faire, GetValue2 (Value1) a une erreur de compilation d'une "inadéquation de type, attendue: String, réelle: Objet", même si dans la récupération, je viens d'appeler getvalue () à nouveau.
S'il vous plaît, arrêtez de prévenir cela. Cela ne fonctionne pas, la récupération et la récupération des méthodes ne gèrent que l'exception, vous ne pouvez pas appeler une autre méthode qui pourrait revenir avec une valeur réussie, ce qui est ce que mon objectif est.
@annédroiïd - Pouvez-vous poster, dans votre question, au moins les signatures de type de toutes les méthodes concernées et le message d'erreur exact que vous obtenez? BTW, Récupérer code> et Recoverwith code> vous permet de calculer et de retourner une valeur réussie. Voir scala-lang.org/api/current/...
"L'expression du type de type [JSOBJECT] ne se conforme pas au type attendu _u" est l'erreur lorsque j'essaie de faire ".Recover {Case E: Exception => GetValue ()}"
@annédroiïd - Depuis getvalue code> renvoie un futur code>, vous devez utiliser Recoverwith code> ici, pas récupérer code>. Jetez un coup d'œil aux Documents API que j'ai liés ci-dessus.
Ce que j'ai fini par faire consiste à utiliser la méthode future.fallbackto (). Si l'avenir du premier Cette solution n'est pas idéale, car je voudrais de préférence inclure les quatre Des exceptions lancées si toutes les tentatives échouent, mais cela me permet au moins de réessayer la méthode getvalue () code> échoue, il va appelera Méthode1 () Code>. Si cela échoue également, il appellera Méthode2 () code> etc. Si l'une des méthodes réussit, il retournera cette valeur. Si aucune des méthodes ne réussit, il retournera l'avenir défaillant de getvalue () code>. P> getvalue () code>. p> p>
On dirait que vous voulez Johnkurkowski.com/posts/...
Ça a l'air génial!
Merci, mais je suis trop paresseux pour taper une réponse digne de la Bounty, et aussi le poteau fait un bon bon travail expliquant les concepts :-)