Elm - Tratamento de Erros
Um erro é qualquer condição inesperada em um programa. Os erros podem ocorrer tanto em tempo de compilação quanto em tempo de execução. Erros de tempo de compilação ocorrem durante a compilação de um programa (por exemplo, erro na sintaxe do programa), enquanto erros de tempo de execução ocorrem durante a execução do programa. Ao contrário de outras linguagens de programação, Elm não lança erros de tempo de execução.
Considere um aplicativo que aceita a idade de um usuário. O aplicativo deve gerar um erro se a idade for zero ou negativa. Nesse caso, o aplicativo Elm pode usar o conceito de tratamento de erros para gerar explicitamente um erro em tempo de execução se o usuário inserir zero ou um valor negativo como idade. O tratamento de erros especifica o curso de ação se algo inesperado acontecer durante a execução do programa.
A linguagem de programação Elm lida com erros das seguintes maneiras -
- MayBe
- Result
Talvez
Considere o recurso de pesquisa em um aplicativo. A função de pesquisa retorna dados relacionados se a palavra-chave de pesquisa for encontrada, caso contrário, não retorna nada. Este caso de uso pode ser implementado no Elm usando o tipo MayBe.
Sintaxe
variable_name:MayBe data_type
Uma variável do tipo MayBe pode conter um dos seguintes valores -
Apenas algum_Valor - é usado se houver dados válidos.
Nada - é usado se o valor estiver ausente ou desconhecido. Nada é equivalente a nulo em outras linguagens de programação.
Ilustração
O exemplo a seguir mostra como usar o tipo MayBe com variáveis e função.
Step 1 - Crie um MayBeDemo.elm arquivo e adicione o seguinte código a ele
-- 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 o módulo em elm repl e execute conforme indicado abaixo
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
A função verifica se o valor passado para a função é Índia, China ou SriLanka. Se o valor do parâmetro não corresponder a nenhum desses, ele não retornará nada.
Resultado
Considere um exemplo em que o aplicativo precisa validar alguma condição e gerar um erro se a condição não for satisfeita. O tipo de resultado pode ser usado para isso. O tipo de resultado deve ser usado se o aplicativo deseja gerar explicitamente um erro e retornar detalhes sobre o que deu errado.
Sintaxe
A declaração do tipo de resultado leva dois parâmetros - o tipo de dados do erro (geralmente String) e o tipo de dados do resultado a ser retornado se tudo correr bem.
type Result error_type data_value_type
= Ok data_value
| Err error_message
O tipo de resultado retorna um dos seguintes valores -
Ok algum_valor - Representa o resultado a ser retornado
Err - representa a mensagem de erro a ser retornada se as condições esperadas não forem satisfeitas.
Ilustração 1
Experimente o seguinte exemplo no 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
A função String.toInt retorna um valor inteiro se o parâmetro passado for válido. Se o parâmetro não for um número, a função retornará um erro.
Ilustração 2
O exemplo a seguir aceita idade como parâmetro. A função retorna a idade se estiver entre 0 e 135, caso contrário, retorna uma mensagem de erro apropriada.
Step 1 - Crie um arquivo ResultDemo.elm e adicione o seguinte código a ele.
--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 o módulo no pacote elm e execute conforme indicado abaixo
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