避免在向不存在的进程发送消息时崩溃

时间:2013-09-20 04:54:27

标签: erlang

在下面的代码中,如果!调用失败,那么我的程序崩溃了。我想回来说,{no_process, "some_process"}而不是崩溃。怎么做到这一点? (我知道对于经验丰富的Erlang开发者来说这是一个微不足道的问题,我还没有...)

test() ->
    some_process ! {test},
    ok.

3 个答案:

答案 0 :(得分:3)

只捕获在向不存在的进程发送消息时发生的异常。这是功能的一个例子:

send_msg(Process, Msg) ->
    try
        Process ! Msg,
        ok
    catch
        error:badarg -> {no_process, Process}
    end.

要发送消息,请致电:

send_msg(some_process, Msg).

答案 1 :(得分:3)

请注意,仅当您使用atom而不是进程标识符时才会发生此错误。因此,您可以尝试使用erlang:whereis/1查找所需流程的pid,如果您获得undefined,则表示该域名未注册,您可以返回{no_process, ProcessName},否则请将邮件发送给Pid你得到了。像这样:

send_msg(Name, Msg) when is_atom(Name) ->
   case erlang:whereis(Name) of
      undefined -> {no_process, Name};
      Pid -> Pid ! Msg
   end;
send_msg(PidOrTuple, Msg) ->
   PidOrTuple ! Msg.

答案 2 :(得分:0)

如果使用pid而不是注册名称,则不会失败。

通常,在监督树中监控已注册的流程,并且每个主管负责其子女的启动和重启策略。对于短暂的生活过程,最好避免姓名注册。