0

我正在使用 eredis 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 主机:端口,例如 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是因为您没有 name 'loc'

于 2013-03-08T12:07:27.743 回答