Comme mentionné par @HristoIliev, votre méthode ne peut pas être récursive queue parce que l'appel finally
n'est pas garanti l'appel de la queue. Cela signifie que toute méthode utilisant try
de cette manière ne sera pas récursive. Voir this answer, aussi.
Appeler la méthode à nouveau est une façon bizarre d'essayer quelque chose de façon répétée jusqu'à ce qu'elle réussisse, car à chaque étape elle lance une exception que vous ne manipulez probablement pas. Au lieu de cela, je discuterais en utilisant une approche fonctionnelle avec Try
, en prenant des échecs d'une vue jusqu'à ce que l'opération réussisse. Le seul désavantage de cette approche est qu'elle ne vous dérange pas en cours de route (ce qui peut aussi être un avantage!).
def tryAll[A](xs: List[A])(f: A => Unit): Unit =
xs.view.map(x => Try(f(x))).takeWhile(_.isFailure).force
scala> val list = List(0, 0, 0, 4, 5, 0)
scala> tryAll(list)(a => println(10/a))
2
Si vous voulez vraiment gérer les exceptions (ou tout simplement la dernière exception), vous pouvez changer (si vous modifiez le code ou tout simplement Try[Unit]
à ne prendre la dernière), le type de retour de tryAll
à List[Try[Unit]]
. Il est préférable que le type de retour de la méthode décrive une partie de ce qu'elle est réellement en train de faire - renvoyant potentiellement des erreurs.
La fonction n'est pas récursive car dans le cas où une exception est levée, le bloc 'finally' n'est pas le dernier code à exécuter. –
@HristoIliev: Je vois - comment puis-je écrire de manière efficace et idiomatique? – pathikrit
Je crois que la façon idiomatique serait d'utiliser 'scala.util.Try' pour envelopper les invocations de fonction, mais je suis incapable de vous fournir un exemple de code. –