【发布时间】:2018-09-14 11:19:57
【问题描述】:
我有一个 gen_server,我用它来捕获出口
%% worker.erl
% ...
init(args) ->
process_flag(trap_exit, true)
% ...
handle_info({'EXIT', SpecialPid, Reason}, SpecialPid) ->
% terminate
exit(normal);
handle_info({'EXIT', _NormalPid, _Reason}, SpecialPid) ->
% ignore
{noreply, SpecialPid}.
我希望能够关闭此gen_server 的监督树:
%% sup_sup.erl
% ...
supervisor:terminate_child(self(), worker_sup),
% ...
当我运行时,我可以终止工人。但是,我收到 OTP 错误,好像进程终止是意外的。我还尝试了exit(normal) 并返回{stop, normal, State} 和{stop, shutdown, State},它们都产生相同的效果。
在关闭期间模拟 OTP 行为的正确方法是什么,同时在其他情况下仍捕获退出?
【问题讨论】:
-
从
handle_info返回{stop, normal, state}怎么样? -
对不起,是的,我确实尝试过。我一直在精神上将
stop与halt转换,但我保证我在实际代码中用stop尝试过:) -
您的代码似乎将 erlang 的东西(如函数子句等)与 elixir 的东西(如小写变量和
:noreply)混合在一起。
标签: erlang