Elm - Gestione degli errori

Un errore è una condizione imprevista in un programma. Gli errori possono verificarsi in fase di compilazione o in fase di esecuzione. Errori in fase di compilazione si verificano durante la compilazione di un programma (ad esempio, errore nella sintassi del programma) mentre errori di runtime si verificano durante l'esecuzione del programma. A differenza di altri linguaggi di programmazione, Elm non genera errori di runtime.

Considera un'applicazione che accetta l'età di un utente. L'applicazione dovrebbe generare un errore se l'età è zero o negativa. In questo caso, l'applicazione Elm può utilizzare il concetto di gestione degli errori per sollevare esplicitamente un errore in fase di esecuzione se l'utente immette zero o un valore negativo come età. La gestione degli errori specifica il corso dell'azione in caso di imprevisti durante l'esecuzione del programma.

Il linguaggio di programmazione Elm gestisce gli errori nei seguenti modi:

  • MayBe
  • Result

Può essere

Considera la funzione di ricerca in un'applicazione. La funzione di ricerca restituisce i dati correlati se la parola chiave di ricerca viene trovata altrimenti non restituisce nulla. Questo caso d'uso può essere implementato in Elm utilizzando il tipo MayBe.

Sintassi

variable_name:MayBe data_type

Una variabile di tipo MayBe può contenere uno dei seguenti valori:

  • Solo some_Value: viene utilizzato se sono presenti dati validi.

  • Niente: viene utilizzato se il valore è assente o sconosciuto. Niente è equivalente a null in altri linguaggi di programmazione.

Illustrazione

L'esempio seguente mostra come utilizzare il tipo MayBe con variabili e funzioni.

Step 1 - Crea un file MayBeDemo.elm file e aggiungi il codice seguente

-- 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 - Importare il modulo in elm repl ed eseguire come indicato di seguito

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 funzione controlla se il valore passato alla funzione è India, Cina o SriLanka. Se il valore del parametro non corrisponde a nessuno di questi, non restituisce nulla.

Risultato

Considera un esempio, in cui l'applicazione deve convalidare una condizione e generare un errore se la condizione non è soddisfatta. Il tipo di risultato può essere utilizzato per ottenere ciò. Il tipo di risultato deve essere utilizzato se l'applicazione desidera sollevare esplicitamente un errore e restituire dettagli su cosa è andato storto.

Sintassi

La dichiarazione del tipo di risultato accetta due parametri: il tipo di dati dell'errore (solitamente String) e il tipo di dati del risultato da restituire se tutto va bene.

type Result error_type data_value_type
= Ok data_value
| Err error_message

Il tipo di risultato restituisce uno dei seguenti valori:

  • Ok some_value - Rappresenta il risultato da restituire

  • Err - Rappresenta il messaggio di errore da restituire se le condizioni previste non sono soddisfatte.

Illustrazione 1

Prova il seguente esempio in 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 funzione String.toInt restituisce il valore Integer se il parametro passato è valido. Se il parametro non è un numero, la funzione restituisce un errore.

Illustrazione 2

L'esempio seguente accetta l'età come parametro. La funzione restituisce l'età se è compresa tra 0 e 135 altrimenti restituisce un messaggio di errore appropriato.

Step 1 - Crea un file ResultDemo.elm e aggiungi il codice seguente.

--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 - Importa il modulo nel pacchetto elm ed esegui come indicato di seguito

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