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