Erlang運行時的錯誤

Erlang運行時發生錯誤時,會返回一些錯誤信息,理解這些信息,對於學好、用好Erlang來講是必要。函數

Erlang中的運行錯誤包括:badarg, badarith, badmatch, function_clause, case_clause, if_clause, undef, noproc, system_limit等。測試

badarg

這個錯誤很好理解,參數類型錯誤,傳入函數的參數和函數聲明要求的參數類型不匹配。atom

badarith

arith,atithmetic的簡寫,運算錯誤,例如將一個整數和一個atom相加。orm

{badmatch, V}

模式匹配錯誤server

function_clause

從字面意思上看,是函數條款的錯誤。該錯誤信息表示找不到匹配的函數。例如,定義一個函數test:add/2,接收兩個整數,並返回它們的和。若是傳入小數,將找不到匹配的分支,會拋出function_clause。進程

{case_clause, V}

case表達式找不到匹配的分支。通常要把「_」加到最後的分支中,做爲容錯或者其它。開發

if_clause

Erlang中if表達式是case表達式的一種特殊方式,要求至少有一個分支測試條件的結果爲true,不然會引起錯誤。get

undef

調用未定義的函數或者模塊時,返回該錯誤信息。it

noproc

進程不存在,例如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)

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.

相關文章
相關標籤/搜索