7. Les erreurs avec Result
Sections
Réglages de lecture
Aucune voix pour cette langue dans ce navigateur.
Plus de voix
Code et termes techniques en anglais
Désactivé : la voix de la page lit tout, sans pause entre deux voix.
Aucune voix pour cette langue dans ce navigateur.
Plus de voix
D’autres voix : Microsoft Edge propose des voix naturelles en ligne, et Windows (Paramètres › Heure et langue › Voix), macOS et Android en installent d’autres.
Une exception sort du flux normal. Result<'ok,'error> garde un échec attendu dans le type de retour :
type Result<'ok, 'error> = | Ok of 'ok | Error of 'errorRéférences officielles : le module Result et la gestion des exceptions.
Valider à la frontière
Section intitulée « Valider à la frontière »Extrait de l07_result.fsx :
type Fret = private Fret of int
module Fret = let create value = if value >= 0 && value <= 24 then Ok (Fret value) else Error $"fret {value} is outside 0..24"Le cas d’union privé empêche de construire Fret -1. Les appelants passent par Fret.create. Une saisie invalide est une donnée attendue, pas une panne exceptionnelle du système.
Parser, puis valider
Section intitulée « Parser, puis valider »let parseInt (text: string) = match System.Int32.TryParse text with | true, value -> Ok value | false, _ -> Error $"'{text}' is not an integer"
let parseFret text = text |> parseInt |> Result.bind Fret.createResult.bind n’appelle la fonction suivante que pour Ok ; une Error traverse inchangée. L’annotation string compte avec .NET 10 : Int32.TryParse possède des surcharges pour chaîne, span de caractères et span d’octets UTF-8. Sans annotation, F# émet FS0041.
Sortie mesurée :
OK 3 -> 3ERROR -1 -> fret -1 is outside 0..24ERROR x -> 'x' is not an integersum: Ok 10Result.maptransforme une réussite avec une fonction qui ne peut échouer.Result.bindpoursuit avec une fonction qui renvoie un autreResult.Result.mapErrorchange la représentation de l’erreur.- un pattern matching final décide quoi afficher ou renvoyer.
Garde les exceptions pour les invariants rompus, l’annulation et les frontières d’infrastructure qui en lancent déjà. Intercepte étroitement et traduis une seule fois vers une erreur métier lorsque la récupération a un sens.
Exercice
Section intitulée « Exercice »Parse un fingering à six éléments tel que x 3 2 0 1 0. Renvoie toutes les erreurs de validation plutôt que la première : cela demande une validation applicative, pas un simple Result.bind. Compare ce compromis avant l’implémentation.
Ensuite, les computation expressions retirent le plumbing répétitif de bind tout en conservant le même chemin d’erreur.