La gestion des erreurs avec scala.util.Try (1/2)

Leave a Comment

Scala 2.10 introduit une nouvelle structure monadique Try. Cette classe est particulièrement adaptée à la représentation d'un traitement pouvant réussir en renvoyant une valeur ou échouer en lançant une exception. Commerçons par un exemple simple : parser un numéro de port renseigné par un utilisateur sous forme d'une chaîne de caractères.

val input: String = ""
val port = input.toInt

Ce code est assez simple mais il n'est pas sans danger. En effet si l'utilisateur rentre une valeur qui n'est pas un entier la deuxième ligne du code ci-dessus lance une exception de type NumberFormatException. Voyons cela en action :

scala>val input = "8080"
input: String = 8080
scala>input.toInt
res0: Int = 8080

Avec un input qui n'est pas un nombre :

scala>val input = "toto"
input: String = toto
scala>input.toInt
java.lang.NumberFormatException: For input string: "toto"

Maintenant encapsulons le parsing dans un objet Try.

scala>import scala.util.Try
import scala.util.Try
scala>val input = "8080"
input: String = 8080
scala>Try(input.toInt)
res1: scala.util.Try[Int] = Success(8080)
Le résultat est une instance de scala.util.Success, l'une des deux classes concrètes dérivées de Try. La méthode get permet de récupérer la valeur.
scala>res1.get
res3: Int = 8080

Que se passe-t-il si une erreur se produit lors du parsing de la chaîne ?

scala>val input = "toto"
input: String = toto
scala>Try(input.toInt)
res4: scala.util.Try[Int]=Failure(java.lang.NumberFormatException: For input string: "toto")
Cette fois-ci le résultat est une instance de scala.util.Failure, l'autre classe concrète dérivée de Try. Il contient l'exception lancée suite au traitement. L'invocation de la méthode get sur une instance de Failure lance l'exception qu'elle contient. Essayons-le :
scala>res4.get
java.lang.NumberFormatException: For input string: "toto"

Il existe une méthode qui permet de spécifier une valeur par défaut qui est renvoyée en cas d'échec du traitement.

scala>res4.getOrElse(80)
res7: Int = 80

Voici pour les bases avant de voir dans la deuxième partie des exemples plus avancés. Stay tuned !

© Nouhoum TRAORE.. Fourni par Blogger.