En Caml, je pense qu'il est particulièrement intéressant de se passer des exceptions. Si une erreur se produit, on le spécifie dans le type de retour de la fonction:
1 2 3 4 5 6 7 8 9 10
| type erreurFonction =
Erreur1
| Erreur2
| Erreur3
;;
type resultat =
Erreur of erreurFonction
| Resultat of int
;; |
Ici, soit le résultat est correct et exploitable, soit on a une erreur avec tous les détails spécifiés dans le type. Sur ce type, on peut faire du pattern-matching:
1 2 3 4 5 6 7
|
let resultat = maFonction parametre1 parametre2
in
match resultat with
| Resultat(v) -> traiterValeur v
| Erreur(err) -> afficherErreur err |
Tu vas me dire qu'on peut faire la même chose avec une exception. Oui, mais dans ce cas il y a une énorme différence: si par inadvertance mon pattern-matching se révélait incomplet (oubli de valeurs possibles), le compilateur le signalera par un warning; en revanche avec les exceptions, si (suite à un oubli de ma part) une exception n'est pas traîtée dans la fonction, elle remontra dans la fonction appelante.
C'est ça que j'appelle "court-circuiter le pattern matching".
Si le matching des exceptions n'est pas complet, le compilateur ne le signalera pas. Or, si j'oublie de traîter une erreur, je souhaite que le compilateur le signale. Propager une erreur à la fonction appelante peut être tout à fait normal, à condition que cela soit un choix délibéré (pattern-matching), et non pas un choix par défaut (exceptions).
Partager