Учебники

Вяз — Обработка ошибок

Ошибка — любое непредвиденное состояние в программе. Ошибки могут возникать во время компиляции или во время выполнения. Ошибки во время компиляции возникают во время компиляции программы (например, ошибка в синтаксисе программы), в то время как ошибки во время выполнения возникают во время выполнения программы. В отличие от других языков программирования, Elm не выдает ошибок во время выполнения.

Рассмотрим приложение, которое принимает возраст пользователя. Приложение должно выдать ошибку, если возраст равен нулю или отрицателен. В этом случае приложение Elm может использовать концепцию обработки ошибок, чтобы явно выдавать ошибку во время выполнения, если пользователь вводит ноль или отрицательное значение в качестве возраста. Обработка ошибок определяет порядок действий, если во время выполнения программы происходит что-то непредвиденное.

Язык программирования Elm обрабатывает ошибки следующими способами:

  • Может быть
  • Результат

Может быть

Рассмотрим функцию поиска в приложении. Функция поиска возвращает связанные данные, если ключевое слово поиска найдено, иначе ничего не возвращает. Этот вариант использования может быть реализован в Elm с использованием типа MayBe.

Синтаксис

variable_name:MayBe data_type

Переменная типа MayBe может содержать одно из следующих значений:

  • Just some_Value — используется, если есть действительные данные.

  • Ничего — используется, если значение отсутствует или неизвестно. Ничто не эквивалентно нулю в других языках программирования.

Just some_Value — используется, если есть действительные данные.

Ничего — используется, если значение отсутствует или неизвестно. Ничто не эквивалентно нулю в других языках программирования.

иллюстрация

В следующем примере показано, как использовать тип MayBe с переменными и функцией.

Шаг 1 — Создайте файл MayBeDemo.elm и добавьте в него следующий код

-- 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

Шаг 2 — Импортируйте модуль в elm repl и выполните, как указано ниже

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

Функция проверяет, передано ли значение функции Индии или Китаю или ШриЛанке. Если значение параметра не соответствует ни одному из них, оно ничего не возвращает.

Результат

Рассмотрим пример, в котором приложению необходимо проверить некоторое условие и выдать ошибку, если условие не выполняется. Тип Result может быть использован для достижения этой цели. Тип Result должен использоваться, если приложение хочет явно выдать ошибку и вернуть подробности о том, что пошло не так.

Синтаксис

Объявление типа Result принимает два параметра — тип данных об ошибке (обычно String) и тип данных результата, который будет возвращен, если все пойдет хорошо.

type Result error_type data_value_type
= Ok data_value
| Err error_message

Тип Result возвращает одно из следующих значений:

  • Ok some_value — представляет результат, который будет возвращен

  • Err — представляет сообщение об ошибке, которое будет возвращено, если ожидаемые условия не выполнены.

Ok some_value — представляет результат, который будет возвращен

Err — представляет сообщение об ошибке, которое будет возвращено, если ожидаемые условия не выполнены.

Иллюстрация 1

Попробуйте следующий пример в 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

Функция String.toInt возвращает целочисленное значение, если переданный параметр является допустимым. Если параметр не является числом, функция возвращает ошибку.

Иллюстрация 2

В следующем примере в качестве параметра принимается возраст. Функция возвращает возраст, если он находится между 0 и 135, в противном случае она возвращает соответствующее сообщение об ошибке.

Шаг 1 — Создайте файл ResultDemo.elm и добавьте в него следующий код.

--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

Шаг 2 — Импортируйте модуль в пакет elm и выполните, как указано ниже