Erlang運行時發生錯誤時,會返回一些錯誤信息,理解這些信息,對於學好、用好Erlang來講是必要。函數
Erlang中的運行錯誤包括:badarg, badarith, badmatch, function_clause, case_clause, if_clause, undef, noproc, system_limit等。測試
這個錯誤很好理解,參數類型錯誤,傳入函數的參數和函數聲明要求的參數類型不匹配。atom
arith,atithmetic的簡寫,運算錯誤,例如將一個整數和一個atom相加。orm
模式匹配錯誤server
從字面意思上看,是函數條款的錯誤。該錯誤信息表示找不到匹配的函數。例如,定義一個函數test:add/2,接收兩個整數,並返回它們的和。若是傳入小數,將找不到匹配的分支,會拋出function_clause。進程
case表達式找不到匹配的分支。通常要把「_」加到最後的分支中,做爲容錯或者其它。開發
Erlang中if表達式是case表達式的一種特殊方式,要求至少有一個分支測試條件的結果爲true,不然會引起錯誤。get
調用未定義的函數或者模塊時,返回該錯誤信息。it
進程不存在,例如gen_server:call一個不存在的進程。io
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)
超出系統上限,如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.