尝试 - 在Erlang中使用spawn_link捕获

时间:2012-07-18 13:04:02

标签: erlang spawn erlang-shell

我是Erlang的新手。现在,我正在学习关于流程的链接。 在下一次实验后我有点困惑:

3> process_flag( trap_exit, true ).
false
4> try 1+1, spawn_link( unknown_module, unknown_function, [] ) of
4> Pid -> Pid
4> catch
4> _:_ -> err
4> end.
<0.37.0>
5> 
=ERROR REPORT==== 18-Jul-2012::16:01:32 ===
Error in process <0.37.0> with exit value: {undef,[{unknown_module,unknown_function,[],[]}]}


5> 
5> flush().
Shell got {'EXIT',<0.37.0>,{undef,[{unknown_module,unknown_function,[],[]}]}}
ok

正如我所料,我已经从已创建的进程中获得了Pid,并且该进程失败了 - 因为模块和功能未知 - 所以我收到了关于它的消息。

之后我尝试了下一步:

6> try spawn_link( unknown_module, unknown_function, [] ) of     
6> Pid -> Pid
6> catch
6> _:_ -> err
6> end.
** exception error: no try clause matching <0.40.0>

我不明白为什么解释器进程无法提取Pid而失败

由于

P.S。

简而言之:为什么下一个代码会破解解释器进程(**异常错误:没有try子句匹配&lt; 0.40.0&gt;)

try spawn_link( unknown_module, unknown_function, [] ) of     
   Pid -> Pid
catch
   _:_ -> err
end.

为什么这段代码不会破解翻译过程(返回&lt; 0.37.0&gt;)

try 1+1, spawn_link( unknown_module, unknown_function, [] ) of     
   Pid -> Pid
catch
   _:_ -> err
end.

???

1 个答案:

答案 0 :(得分:3)

哦......我忘了变量Pid已经绑定了值(在调用第一个try-catch块之后)。 所以我需要的是 - 取消绑定变量Pid。 打电话给翻译f(Pid). - 解决了我的问题