我可以捕获退出(self(),kill)吗?

时间:2012-10-30 06:54:55

标签: erlang

当我从learnyousomeerlang.com阅读一篇文章时,我得到了一个问题。 http://learnyousomeerlang.com/errors-and-processes

它说:

  

例外来源: exit(self(), kill)

     

未打包的结果: ** exception exit: killed

     

陷阱结果: ** exception exit: killed

     哎呀,看看那个。似乎这个实际上是不可能陷阱的。我们来看看吧。

但它不符合我用代码打击测试的内容:

  -module(trapexit).
  -compile(export_all).
  self_kill_exit()->
  process_flag(trap_exit,true),
  Pid=spawn_link(fun()->timer:sleep(3000),exit(self(),kill)  end),
  receive
    {_A,Pid,_B}->io:format("subinmain:~p output:~p~n",[Pid,{_A,Pid,_B}])
  end.

oupput是: ** 4> trapexit:self_kill_exit()

subinmain:其中0.36.0>输出:{ '退出',< 0.36.0>,杀} **

并且不符合陷阱结果:**异常退出:之前杀死说。哪个是对的?

1 个答案:

答案 0 :(得分:4)

作为self参数传递的函数体中对spawn_link的调用不会返回调用spawn_link的进程。它正在新生成的过程中进行评估,因此它将返回其pid。进行以下更改。

-module(trapexit).
-compile(export_all).
self_kill_exit()->
  process_flag(trap_exit,true),
  Self=self(),
  Pid=spawn_link(fun()->timer:sleep(3000),exit(Self,kill)  end),
  receive
    {_A,Pid,_B}->io:format("subinmain:~p output:~p~n",[Pid,{_A,Pid,_B}])
  end.

现在它应该按预期工作。

10> c(trapexit).            
{ok,trapexit}
11> trapexit:self_kill_exit().
** exception exit: killed

这本书是对的。陷阱exit(self(), kill)是不可能的。