当我从 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.
Run Code Online (Sandbox Code Playgroud)
输出为:**4> trapexit:self_kill_exit()。
subinmain:<0.36.0> 输出:{'EXIT',<0.36.0>,killed}**
并且不符合 Trapped Result: ** 异常退出:被杀之前说的。哪个是对的???
要在通话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.
Run Code Online (Sandbox Code Playgroud)
现在它应该按预期工作。
10> c(trapexit).
{ok,trapexit}
11> trapexit:self_kill_exit().
** exception exit: killed
Run Code Online (Sandbox Code Playgroud)
书是对的。诱捕exit(self(), kill)是不可能的。
| 归档时间: |
|
| 查看次数: |
658 次 |
| 最近记录: |