3

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.

出力は次のとおりです: **4> trapexit:self_kill_exit()。

subinmain:<0.36.0> 出力:{'EXIT',<0.36.0>,killed}**

Trapped Result: ** exception exit: kill said before に準拠していません。どっちが正しい???

4

1 に答える 1

5

self引数として渡された関数の本体でのtoの呼び出しは、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)はできません。

于 2012-10-30T07:31:07.707 に答える