2013-03-08 36 views
0

我正在使用eredis erlang客戶端,我是Erlang的新手。我想知道什麼可能是錯誤有以下功能:Erlang中的異常處理

foo(Host, Port) -> 
    case catch eredis:start_link(Host, Port) of 
     {connection_error, {connection_error, _}} -> {error, "failed"}; 
     {ok, Connection} -> {"done"}; 
     _ -> {error, "Unknown"} 
    end. 

我的理解是,鑑於上述功能和有效的Redis主機:端口例如本地主機:6379那麼,如果我做的:

mymodule:foo('localhost', 6379). 

我應該得到的答案

{"done"} 

而例如如果我做的:

mymodule:foo('loc', 6379). 

我應該得到:

{error, "failed"} 

但在後一種情況下,我得到的是:

** exception exit: {connection_error,{connection_error,nxdomain}} 

難道有人會好心解釋我在這裏做錯了什麼?

感謝

回答

1

這個問題可能是你的異常是從gen_server開始了你的啓動環節所產生eredis_client。它應該返回{error, Term}給你,並從不拋出異常。你也與過程有關,所以你可能因此而死亡。

你很需要在Erlang中做異常處理。在這裏您可以直接處理錯誤

case eredis:start_link(Host, Port) of 
    {ok, Pid} -> {ok, Pid}; 
    {error, Reason} -> {error, Reason} 
end. 

應該足夠了。事實上,你可以做

{ok, Pid} = eredis:start_link(Host, Port) 

並利用崩潰,如果出現問題的時候。由於nxdomain,您看到的錯誤是因爲您沒有名稱'loc'