Eh bien, la réponse est clairement décrite dans scaladocs:
/** Creates a new future that will handle any matching throwable that this
* future might contain. If there is no match, or if this future contains
* a valid result then the new future will contain the same.
*
* Example:
*
* {{{
* Future (6 / 0) recover { case e: ArithmeticException => 0 } // result: 0
* Future (6 / 0) recover { case e: NotFoundException => 0 } // result: exception
* Future (6 / 2) recover { case e: ArithmeticException => 0 } // result: 3
* }}}
*/
def recover[U >: T](pf: PartialFunction[Throwable, U])(implicit executor: ExecutionContext): Future[U] = {
/** Creates a new future that will handle any matching throwable that this
* future might contain by assigning it a value of another future.
*
* If there is no match, or if this future contains
* a valid result then the new future will contain the same result.
*
* Example:
*
* {{{
* val f = Future { Int.MaxValue }
* Future (6 / 0) recoverWith { case e: ArithmeticException => f } // result: Int.MaxValue
* }}}
*/
def recoverWith[U >: T](pf: PartialFunction[Throwable, Future[U]])(implicit executor: ExecutionContext): Future[U] = {
recover
enveloppements plaine résultat en Future
pour vous (analogue de l' map
), tandis que l' recoverWith
prévoit Future
que le résultat (analogue de l' flatMap
).
Donc, ici, c'est la règle de base:
Si vous retrouvez avec quelque chose qui renvoie déjà Future
, utilisez recoverWith
, sinon utilisez recover
.
upd
Dans votre cas, à l'aide de recover
est préféré, comme recover
va envelopper votre exception en Future
pour vous. Sinon il n'y a pas de gain de performance ou de n'importe quoi, donc il vous suffit d'éviter réutilisable.