在下面的代码中,如果!
调用失败,那么我的程序就会崩溃。我想返回,比如说,{no_process, "some_process"}
而不是崩溃。如何做到这一点?(我知道对于经验丰富的 Erlang 开发人员来说这是一个微不足道的问题,我还没有......)
test() ->
some_process ! {test},
ok.
在下面的代码中,如果!
调用失败,那么我的程序就会崩溃。我想返回,比如说,{no_process, "some_process"}
而不是崩溃。如何做到这一点?(我知道对于经验丰富的 Erlang 开发人员来说这是一个微不足道的问题,我还没有......)
test() ->
some_process ! {test},
ok.
只需捕获当您向不存在的进程发送消息时发生的异常。这是执行此操作的函数示例:
send_msg(Process, Msg) ->
try
Process ! Msg,
ok
catch
error:badarg -> {no_process, Process}
end.
要发送您的信息,请致电:
send_msg(some_process, Msg).
请注意,仅当您使用 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.
如果您使用 pid 而不是注册名称,则不会失败。
通常注册的进程在监督树中被监控,每个监督者负责其子进程的启动和重启策略。对于短暂的生活过程,最好避免名称注册。