0

私はerediserlangクライアントを使用していますが、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 host:port、たとえばlocalhost:6379が与えられた場合、次のようになります。

mymodule:foo('localhost', 6379).

私は答えを得る必要があります

{"done"}

たとえば、私が行う場合:

mymodule:foo('loc', 6379).

私は得る必要があります:

{error, "failed"}

しかし、後者の場合、私が得るものは次のとおりです。

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

誰かが私がここで間違っていることを親切に説明できますか?

ありがとう

4

1 に答える 1

1

eredis_client問題はおそらく、あなたの例外があなたがあなたのスタートリンクで始めたgen_serverに起因しているということです。それは{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'

于 2013-03-08T12:07:27.743 に答える