Erlang運行時的錯誤


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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM