Elm - Manejo de errores
Un error es cualquier condición inesperada en un programa. Los errores pueden ocurrir en tiempo de compilación o en tiempo de ejecución. Los errores de tiempo de compilación ocurren durante la compilación de un programa (por ejemplo, un error en la sintaxis del programa) mientras que los errores de tiempo de ejecución ocurren durante la ejecución del programa. A diferencia de otros lenguajes de programación, Elm no arroja errores en tiempo de ejecución.
Considere una aplicación que acepta la edad de un usuario. La aplicación debería arrojar un error si la edad es cero o negativa. En este caso, la aplicación Elm puede usar el concepto de manejo de errores para generar explícitamente un error en tiempo de ejecución si el usuario ingresa cero o un valor negativo como edad. El manejo de errores especifica el curso de acción si ocurre algo inesperado durante la ejecución del programa.
El lenguaje de programación Elm maneja los errores de las siguientes maneras:
- MayBe
- Result
Tal vez
Considere la función de búsqueda en una aplicación. La función de búsqueda devuelve datos relacionados si se encuentra la palabra clave de búsqueda; de lo contrario, no devuelve nada. Este caso de uso se puede implementar en Elm usando el tipo MayBe.
Sintaxis
variable_name:MayBe data_type
Una variable de tipo MayBe puede contener cualquiera de los siguientes valores:
Just some_Value: se utiliza si hay datos válidos.
Nada: se usa si el valor está ausente o se desconoce. Nada es equivalente a nulo en otros lenguajes de programación.
Ilustración
El siguiente ejemplo muestra cómo usar el tipo MayBe con variables y función.
Step 1 - Crea un MayBeDemo.elm archivo y agregue el siguiente código
-- MayBeDemo.elm
module MayBeDemo exposing(..)
import Maybe
--declaring a MayBe variable and assigning value to it
userName : Maybe String
userName = Just "Mohtashim"
--declaring a MayBe variable and assigning value to it
userAge :Maybe Int
userAge = Just 20
--declaring a MayBe variable and assigning value to it
userSalary:Maybe Float
userSalary = Nothing
--declaring a custom type
type Country = India | China | SriLanka
--defining a function that takes a String parameter as input and returns a value of type MayBe
getCountryFromString : String -> Maybe Country
getCountryFromString p =
case p of
"India"
-> Just India
"China"
-> Just China
"SriLanka"
-> Just SriLanka
_
-> Nothing
Step 2 - Importe el módulo en elm repl y ejecútelo como se indica a continuación
E:\ElmWorks\ErroApp> elm repl
---- elm-repl 0.18.0 -----------------------------------------------------------
:help for help, :exit to exit, more at
-------------------------------------------------------------------------------- > import MayBeDemo exposing(..) > userName Just "Mohtashim" : Maybe.Maybe String > userAge Just 20 : Maybe.Maybe Int > userSalary Nothing : Maybe.Maybe Float > getCountryFromString "India" Just India : Maybe.Maybe MayBeDemo.Country > getCountryFromString "india" Nothing : Maybe.Maybe MayBeDemo.Country
La función comprueba si el valor pasado a la función es India, China o SriLanka. Si el valor del parámetro no coincide con ninguno de estos, no devuelve nada.
Resultado
Considere un ejemplo, donde la aplicación necesita validar alguna condición y generar un error si la condición no se satisface. El tipo de resultado se puede utilizar para lograr esto. El tipo de resultado debe usarse si la aplicación desea generar un error explícitamente y devolver detalles sobre lo que salió mal.
Sintaxis
La declaración del tipo de resultado toma dos parámetros: el tipo de datos del error (generalmente String) y el tipo de datos del resultado que se devolverá si todo va bien.
type Result error_type data_value_type
= Ok data_value
| Err error_message
El tipo de resultado devuelve cualquiera de los siguientes valores:
Ok some_value: representa el resultado que se devolverá
Err: representa el mensaje de error que se devolverá si no se cumplen las condiciones esperadas.
Ilustración 1
Pruebe el siguiente ejemplo en Elm REPL:
> String.toInt
<function> : String -> Result.Result String Int
-- successful result
> String.toInt "10"
Ok 10 : Result.Result String Int
-- unsuccessful result , Error
> String.toInt "a"
Err "could not convert string 'a' to an Int" : Result.Result String Int
La función String.toInt devuelve un valor entero si el parámetro pasado es válido. Si el parámetro no es un número, la función devuelve un error.
Ilustración 2
El siguiente ejemplo acepta la edad como parámetro. La función devuelve la edad si está entre 0 y 135; de lo contrario, devuelve un mensaje de error apropiado.
Step 1 - Cree un archivo ResultDemo.elm y agréguele el siguiente código.
--ResultDemo.elm
module ResultDemo exposing(..)
userId : Result String Int
userId = Ok 10
emailId : Result String Int
emailId = Err "Not valid emailId"
isReasonableAge : String -> Result String Int
isReasonableAge input =
case String.toInt input of
Err r ->
Err "That is not a age!"
Ok age ->
if age < 0 then
Err "Please try again ,age can't be negative"
else if age > 135 then
Err "Please try agian,age can't be this big.."
else
Ok age
Step 2 - Importe el módulo en el paquete elm y ejecútelo como se indica a continuación
E:\ElmWorks\ElmRepo\15_ErrorHandling\15_Code> elm repl
---- elm-repl 0.18.0 -----------------------------------------------------------
:help for help, :exit to exit, more at <https://github.com/elm-lang/elm-repl>
--------------------------------------------------------------------------------
> import ResultDemo exposing (..)
> userId
Ok 10 : Result.Result String Int
> emailId
Err "Not valid emailId" : Result.Result String Int
> isReasonableAge "10"
Ok 10 : Result.Result String Int
> isReasonableAge "abc"
Err "That is not a age!" : Result.Result String Int