Elm - 错误处理

错误是程序中的任何意外情况。 错误可能发生在编译时或运行时。 编译时错误发生在程序编译期间(例如,程序语法错误),而运行时错误发生在程序执行期间。 与其他编程语言不同,Elm 不会抛出运行时错误。

考虑一个接受用户年龄的应用程序。 如果年龄为零或负数,应用程序应抛出错误。 在这种情况下,如果用户输入零或负值作为年龄,Elm 应用程序可以使用错误处理的概念在运行时显式引发错误。 错误处理指定在程序执行期间发生任何意外情况时的操作过程。

Elm 编程语言以下列方式处理错误 −

  • MayBe
  • Result

MayBe

考虑应用程序中的搜索功能。 如果找到搜索关键字,搜索功能将返回相关数据,否则不返回任何内容。 该用例可以使用 MayBe 类型在 Elm 中实现。

语法

variable_name:MayBe data_type

MayBe 类型的变量可以包含以下值之一 −

  • Just some_Value − 如果有有效数据,则使用此方法。

  • Nothing − 如果该值不存在或未知,则使用此值。 在其他编程语言中,没有什么与 null 等效。

示例

以下示例展示了如何将 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

该函数检查传递给该函数的值是否是India、China或SriLanka。 如果参数的值与其中任何一个都不匹配,则不会返回任何内容。

Result

考虑一个示例,其中应用程序需要验证某些条件并在不满足条件时引发错误。 Result 类型可用于实现此目的。 如果应用程序想要显式引发错误并返回有关错误原因的详细信息,则应使用 Result 类型。

语法

结果类型声明采用两个参数 - 错误的数据类型(通常为字符串)和一切正常时返回结果的数据类型。

type Result error_type data_value_type
= Ok data_value
| Err error_message

结果类型返回以下值之一−

  • 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 函数将返回 Integer 值。 如果参数不是数字,函数将返回错误。

示例 2

以下示例接受年龄作为参数。 如果 age(年龄)在 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 包中的模块并执行如下

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