在Erlang编程指南中,提到了Erlang程序在运行是出现的错误,并简单说明了原因,在此记录下,并简单描述下避免错误发生的措施。以供今后查询之用。
1、function_clause
当已存在的函数模式无一匹配该函数时,就是出现该错误。此错误通常发生在两种情况下:1、在分析条件中,遗漏某种匹配模式;2、使用了错误的参数。
factorial(N) when N > 0 ->
N * factorial(N - 1);
factorial(0) -> 1.
1> test:factorial(-1).
** exception error: no function clause matching test:factorial(-1)
2、case_clause
当case结构中没有与现有的模式匹配是就会出现该错误。最常见的原因是忘记一种或多种可能出现的情况。
test1(N) ->
case N of
−1 -> false;
1 -> true
end.
1> test:test1(0).
** exception error: no case clause matching 0 in function test:test1/1
3、if_clause
和case_clause相类似。
上述三种情况,都是因为遗漏或使用错误的参数导致的,避免类似错误情况出现的简单方法有:
1、在函数中,考虑可能出现的其他情况,如在factorial/1中加入
factorial(_Any) ->
……
这样就可以明显地看出错误出现的地方,及时找到出错位置。
4、badmatch
在Erlang程序中,最常用的就是模式的匹配,badmatch这类出错出现的可能性是较大的。错误出现的情况一般是模式匹配失败,但是对于这类错误,原因是多样的。
A、尝试将值赋给已绑定的变量;
B、匹配某函数的返回值。
5、badarg
参数调用错误。调用某函数时,参数使用错误会导致该错误的发生。
如:test(helloworld) ->
……
helloword为原子,并非变量,因此会出错。
6、undef
当调用某定义或者是未导出的函数时会出现该错误。
当在B module中调用A module中的函数时,应该在A module中将该函数export。
7、Badarith
当算术运算时使用了不恰当的参数时会出现该错误。
如整数、浮点数视图除以0时。
在Erlang 中有自带的程序调试工具,但是,在一般情况下,通过对?DEBUG 或者是 io:format()函数使用,可快速找到出现错误的位置。在程序代码中,可善用之。