【发布时间】:2012-06-22 02:46:20
【问题描述】:
刚接触 Erlang,只是有点难以理解新范式!
好的,所以我在 OTP gen_server 中有这个内部函数:
my_func() ->
Result = ibrowse:send_req(?ROOTPAGE,[{"User-Agent",?USERAGENT}],get),
case Result of
{ok, "200", _, Xml} -> %<<do some stuff that won't interest you>>
,ok;
{error,{conn_failed,{error,nxdomain}}} -> <<what the heck do I do here?>>
end.
如果我忽略了处理连接失败的情况,那么我会收到一个传播到主管的退出信号,它会与服务器一起关闭。
我想要发生的事情(至少我认为这是我想要发生的事情)是在连接失败时我想暂停然后重试 send_req 说 10 次,此时主管可能会失败。
如果我做了这样丑陋的事情......
{error,{conn_failed,{error,nxdomain}}} -> stop()
它会关闭服务器进程,是的,我可以使用我的(在 10 秒内尝试 10 次)重启策略直到它失败,这也是期望的结果,但是从服务器到主管的返回值是 'ok ' 当我真的想返回 {error,error_but_please_dont_fall_over_mr_supervisor} 时。
我强烈怀疑在这种情况下,我应该处理所有业务问题,例如在“my_func”中重试失败的连接,而不是试图让进程停止然后让主管重新启动它以便再次尝试.
问题:在这种情况下,“Erlang 方式”是什么?
【问题讨论】:
标签: erlang erlang-otp erlang-supervisor