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.
1
2
|
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 :
1
2
3
4
|
scala> val input = "8080" input : String = 8080 scala>input.toInt res 0 : Int = 8080 |
Avec un input qui n'est pas un nombre :
1
2
3
4
|
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.
1
2
3
4
5
6
|
scala> import scala.util.Try import scala.util.Try scala> val input = "8080" input : String = 8080 scala>Try(input.toInt) res 1 : 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.
1
2
|
scala>res 1 .get res 3 : Int = 8080 |
Que se passe-t-il si une erreur se produit lors du parsing de la chaîne ?
1
2
3
4
|
scala> val input = "toto" input : String = toto scala>Try(input.toInt) res 4 : 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 :
1
2
|
scala>res 4 .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.
1
2
|
scala>res 4 .getOrElse( 80 ) res 7 : Int = 80 |
Voici pour les bases avant de voir dans la deuxième partie des exemples plus avancés. Stay tuned !
1 comment for “La gestion des erreurs avec scala.util.Try (1/2)”