请考虑以下代码:
    -module(abc).
    -export([f/1]).
    f(X) when (X==0) or (1/X>2) -> X+100;
    f(X) ->X.
和abc:f(0).得到结果0,但为什么1/X不抛异常?
erlang文档的Guard Sequences部分说:
如果算术表达式,布尔表达式,短路表达式或对保护BIF的调用失败(因为参数无效),则整个保护失败.如果守卫是守卫序列的一部分,则将评估序列中的下一个守卫(即下一个分号后面的守卫).
换句话说,守卫中的异常被视为守卫在没有提出异常的情况下返回虚假.警卫的评估与正常的erlang表达略有不同.
调用时abc:f(0),将计算表达式(0==0) or (1/0>2).这个表达式"失败",因为除以零,所以守卫不匹配,下一个子句被评估给出答案0.
如果您希望返回此案例,则100有两个选项:使用保护序列或使用短路布尔运算符.这些将是
f(X) when X==0; 1/X>2 -> X + 100;
f(X) -> X.
和
f(X) when X==0 orelse 1/X>2 -> X + 100;
f(X) -> X.
分别.两种写入方式都将X==0作为单独的异常进行评估,1/X>2如果结果为真则不执行.