为什么case
在保护失败时不会抛出运行时异常,而是静默失败,从而隐藏潜在的错误?
例如为什么
case [] do
xs when hd(xs) -> "Won't match"
xs -> "Got #{xs}"
end
由于hd(xs)
失败,不会返回参数错误
UPDATE :我提出了这个问题,因为Haskell中的警卫不会发生同样的情况。例如,函数
myfun x
| head([]) == x = 100
| otherwise = 200
在GHCi中调用时生成
λ> myfun 6
*** Exception: Prelude.head: empty list
简而言之,与没有隐藏程序员例外的Haskell形成鲜明对比的是,Elixir在守卫中吃异常的行为背后的设计理由是什么?
谢谢,
答案 0 :(得分:3)
保护功能引发的任何错误都会被忽略,并且匹配被视为不成功。这在http://erlang.org/doc/reference_manual/expressions.html#id84741:
中记录如果算术表达式,布尔表达式,短路表达式或对保护BIF的调用失败(因为参数无效),则整个保护失败。如果守卫是守卫序列的一部分,则会对序列中的下一个守卫(即下一个分号后面的守卫)进行评估。