在下面的代码中,如果!
调用失败,那么我的程序崩溃了。我想回来说,{no_process, "some_process"}
而不是崩溃。怎么做到这一点? (我知道对于经验丰富的Erlang开发者来说这是一个微不足道的问题,我还没有...)
test() ->
some_process ! {test},
ok.
答案 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而不是注册名称,则不会失败。
通常,在监督树中监控已注册的流程,并且每个主管负责其子女的启动和重启策略。对于短暂的生活过程,最好避免姓名注册。