7. Errores con Result
Secciones
Ajustes de lectura
Ninguna voz para este idioma en este navegador.
Más voces
Código y términos técnicos en inglés
Desactivado: la voz de la página lo lee todo, sin pausa entre dos voces.
Ninguna voz para este idioma en este navegador.
Más voces
Más voces: Microsoft Edge ofrece voces naturales en línea, y Windows (Configuración › Hora e idioma › Voz), macOS y Android instalan otras.
Una excepción sale del flujo normal. Result<'ok,'error> mantiene un fallo esperado en el tipo de retorno:
type Result<'ok, 'error> = | Ok of 'ok | Error of 'errorReferencias oficiales: el módulo Result y el manejo de excepciones.
Validar en el límite
Sección titulada «Validar en el límite»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"El caso de unión privado impide construir Fret -1; los consumidores pasan por Fret.create. Una entrada inválida es un dato esperado, no un fallo excepcional del sistema.
Analizar y después validar
Sección titulada «Analizar y después validar»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 llama a la siguiente función solo para Ok; un Error pasa sin cambios. La anotación string importa en .NET 10: Int32.TryParse tiene sobrecargas para string, span de caracteres y span de bytes UTF-8. Sin anotación, F# emite FS0041.
Salida medida:
OK 3 -> 3ERROR -1 -> fret -1 is outside 0..24ERROR x -> 'x' is not an integersum: Ok 10Result.maptransforma un éxito con una función que no falla.Result.bindcontinúa con una función que devuelve otroResult.Result.mapErrorcambia la representación del error.- un pattern matching final decide qué mostrar o devolver.
Reserva las excepciones para invariantes rotos, cancelación y límites de infraestructura que ya las lanzan. Captura de forma estrecha y traduce una sola vez a un error de dominio cuando recuperarse tenga sentido.
Ejercicio
Sección titulada «Ejercicio»Analiza un fingering de seis elementos como x 3 2 0 1 0. Devuelve todos los errores de validación, no solo el primero: eso requiere validación aplicativa, no un simple Result.bind. Compara el compromiso antes de implementarlo.
Después, las computation expressions eliminan el plumbing repetitivo de bind conservando el mismo camino de error.