Elm 错误处理
错误是程序中的任何意外情况。错误可能在编译时或运行时发生。编译时错误发生在程序编译期间(例如,程序语法错误),而运行时错误发生在程序执行期间。与其他编程语言不同,Elm不会引发运行时错误。
考虑一个接受用户年龄的应用程序。如果年龄为零或负数,则应用程序应引发错误。在这种情况下,如果用户输入0或负值作为年龄,则Elm应用程序可以使用错误处理的概念在运行时显式引发错误。如果在程序执行期间发生任何意外情况,错误处理将指定处理措施。
Elm 编程语言通过以下方式处理错误
也许
结果
MayBe
考虑应用程序中的搜索功能。如果找到搜索关键字,则搜索功能返回相关数据,否则不返回任何内容。可以使用MayBe类型在Elm中实现此用例。
语法
variable_name:MayBe data_type
类型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类型。
语法
Result类型声明有两个参数-错误的数据类型(通常为String)和一切正常的情况下要返回的结果的数据类型。
type Result error_type data_value_type = Ok data_value | Err error_message
Result 类型返回以下任一值-
确定 some_value 表示要返回的结果
Err-表示如果不满足预期条件,将返回的错误消息。
示例一
在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值。如果参数不是数字,则该函数返回错误。
示例二
以下示例接受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