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