Erlang運行時發生錯誤時,會返回一些錯誤信息,理解這些信息,對於學好、用好Erlang來說是必要。
Erlang中的運行錯誤包括:badarg, badarith, badmatch, function_clause, case_clause, if_clause, undef, noproc, system_limit等。
badarg
這個錯誤很好理解,參數類型錯誤,傳入函數的參數和函數聲明要求的參數類型不匹配。
badarith
arith,atithmetic的簡寫,運算錯誤,例如將一個整數和一個atom相加。
{badmatch, V}
模式匹配錯誤
function_clause
從字面意思上看,是函數條款的錯誤。該錯誤信息表示找不到匹配的函數。例如,定義一個函數test:add/2,接收兩個整數,並返回它們的和。如果傳入小數,將找不到匹配的分支,會拋出function_clause。
{case_clause, V}
case表達式找不到匹配的分支。一般要把“_”加到最后的分支中,作為容錯或者其它。
if_clause
Erlang中if表達式是case表達式的一種特殊方式,要求至少有一個分支測試條件的結果為true,否則會引發錯誤。
undef
調用未定義的函數或者模塊時,返回該錯誤信息。
noproc
進程不存在,例如gen_server:call一個不存在的進程。
Pid = pid(0, 100, 10).
gen_server:call(Pid, test).
** exception exit: {noproc,{gen_server,call,[<0.100.10>,test]}}
in function gen_server:call/2 (gen_server.erl, line 182)
system_limit
超出系統上限,如atom,ets,port,process等。
異常處理
在開發中可使用try,catch捕獲異常,同時也可以調用erlang:get_stacktrace()獲取棧信息,定位錯誤。
try:
exprs
catch
Class:Reason ->
%% 異常處理代碼
%% Class為異常類型,Reason為異常原因
ok
end.
例如:
try:
whatever
catch
Class:Reason ->
io:format("Class:~p, Reason:~p~nstacktrace:~n~p",
[Class, Reason, erlang:get_stacktrace()]),
error
end.
