错误处理
Elm 的一项保证是,实际上您不会看到运行时错误。这部分是因为Elm 将错误视为数据。我们不会崩溃,而是用自定义类型显式地建模失效的可能性。例如,假设您想将用户输入变成一个年龄。您可以创建一个这样的自定义类型
type MaybeAge
= Age Int
| InvalidInput
toAge : String -> MaybeAge
toAge userInput =
...
-- toAge "24" == Age 24
-- toAge "99" == Age 99
-- toAge "ZZ" == InvalidInput
无论是什么输入提供给 toAge
函数,它总会产生一个值。有效输入产生诸如 Age 24
和 Age 99
之类的值,而无效输入会产生 InvalidInput
值。在此基础上,我们使用模式匹配,它将确保对两种可能性都进行了说明。不会崩溃!
这方面的事情经常出现!例如,也许您想将一组用户输入变成一个 Post
以与其他人共享。但如果他们忘记添加标题会怎么样?或者这篇文章没有内容呢?我们可以对所有这些问题进行明确建模
type MaybePost
= Post { title : String, content : String }
| NoTitle
| NoContent
toPost : String -> String -> MaybePost
toPost title content =
...
-- toPost "hi" "sup?" == Post { title = "hi", content = "sup?" }
-- toPost "" "" == NoTitle
-- toPost "hi" "" == NoContent
与其仅仅说输入无效,我们描述事情可能出错的每一种方式。如果我们有一个 viewPreview : MaybePost -> Html msg
函数来预览有效帖子,那么现在当某些事情出错时,我们可以在预览区域中给出更具体的错误消息!
诸如此类的状况极其常见。为您的确切情况创建一个自定义类型通常很有价值,但在某些更简单的情况下,您可以使用现成的类型。因此,本章的其余部分将探讨 Maybe
和 Result
类型,展示它们如何帮助您将错误视为数据!