1

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

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

3 回答 3

3

只需捕获当您向不存在的进程发送消息时发生的异常。这是执行此操作的函数示例:

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

要发送您的信息,请致电:

send_msg(some_process, Msg).
于 2013-09-20T05:11:30.917 回答
3

请注意,仅当您使用 atom 而不是进程标识符时才会发生此错误。因此,您可以尝试查找所需进程的 pid,erlang:whereis/1如果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.
于 2013-09-20T06:20:52.997 回答
0

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

通常注册的进程在监督树中被监控,每个监督者负责其子进程的启动和重启策略。对于短暂的生活过程,最好避免名称注册。

于 2013-09-20T06:26:34.467 回答