Erlang除了提供try catch,catch等语法,还支持link和monitor两种监控进程的机制,使得所有进程可以连接起来,组成一个整体。除了这样,erlang还提供trap_exit方法让进程主动捕获异常退出消息,避免发生异常时被系统关闭。
trap_exit说明
erlang设计上有速错(fast on fail)的原则,就是让问题快速暴露,迅速停止这个进程的运行,以避免这个进程错误执行造成更多的错误。但是在业务层需要容错,所以erlang就把选择权交给用户,通过process_flag(trap_exit,true)来避免进程被异常关闭。
-module(test).
-compile(export_all).
start() ->
Pid = spawn(
fun() ->
process_flag(trap_exit,true),
do_loop()
end),
register(test, Pid).
do_loop() ->
receive
Msg ->
io:format("recv ~w~n", [Msg])
end,
do_loop().
测试如下:
1> test:start().
true
2> exit(whereis(test),normal).
recv {'EXIT',<0.35.0>,normal}
true
3> whereis(test).
<0.33.0>
这里可以看出进程被exit/2 后并没有挂掉。