在案例表达式中警卫失败时的Elixir行为

时间:2017-11-28 18:53:55

标签: erlang elixir

为什么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在守卫中吃异常的行为背后的设计理由是什么?

谢谢,

1 个答案:

答案 0 :(得分:3)

保护功能引发的任何错误都会被忽略,并且匹配被视为不成功。这在http://erlang.org/doc/reference_manual/expressions.html#id84741

中记录
  

如果算术表达式,布尔表达式,短路表达式或对保护BIF的调用失败(因为参数无效),则整个保护失败。如果守卫是守卫序列的一部分,则会对序列中的下一个守卫(即下一个分号后面的守卫)进行评估。