Erlang 我可以陷阱退出(self(),kill)吗?

Erlang 我可以陷阱退出(self(),kill)吗?,erlang,Erlang,当我读到LearnyYouSomerlang.com上的一篇文章时,我有一个问题。 它说: 异常源:退出(self(),kill) 未跟踪结果:**异常退出:已终止 捕获结果:**异常退出:终止 哎呀,看那个。看起来这一个实际上是不可能陷阱。让我们检查一下 但它不符合我用代码blow测试的内容: -module(trapexit). -compile(export_all). self_kill_exit()-> process_flag(trap_exit,true),

当我读到LearnyYouSomerlang.com上的一篇文章时,我有一个问题。

它说:

异常源:
退出(self(),kill)

未跟踪结果:
**异常退出:已终止

捕获结果:
**异常退出:终止

哎呀,看那个。看起来这一个实际上是不可能陷阱。让我们检查一下

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

  -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.
输出为: **4> trapexit:self_kill_exit()

subinmain:输出:{'EXIT',killed}**


并且不符合捕获结果:**异常退出:之前说过杀死。哪个是正确的???

函数体中对
self
的调用作为参数传递给
spawn\u link
不会返回调用
spawn\u 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
这本书是对的。无法捕获
退出(self(),kill)