2014-05-06 77 views
1

我在Erlang中有以下代码,其中我正在使用一个不存在的模块。 在一些Erlang/meck版本中,这会产生一个看起来不可捕捉的异常。Erlang无法捕捉的异常

任何人都知道Erlang中是否存在“无法捕捉的异常”功能?

try 
    meck:new(i_dont_exist), 
    io:format("No exception in this version of Erlang ... :("), 
    no_problems 
catch 
    exit:_ -> exit; 
    error:_ -> error; 
    throw:_ -> throw; 
    _:_ -> what_class_is_it 
    after 
     io.format("in the after~n") 
end. 

当我执行这个代码,这是我所得到的(注意,不是连“后”正在执行条款,所以它看起来更像是给我一个bug):

** exception exit: {undefined_module,i_dont_exist} 
    in function meck_proc:resolve_can_expect/3 (src/meck_proc.erl, line 402) 
    in call from meck_proc:init/1 (src/meck_proc.erl, line 194) 
    in call from gen_server:init_it/6 (gen_server.erl, line 304) 
    in call from proc_lib:init_p_do_apply/3 (proc_lib.erl, line 227) 

我有还试图用同样的结果“抓”的表达:

> catch meck:new(i_dont_exist). 
** exception exit: {undefined_module,i_dont_exist} 
    in function meck_proc:resolve_can_expect/3 (src/meck_proc.erl, line 402) 
    in call from meck_proc:init/1 (src/meck_proc.erl, line 194) 
    in call from gen_server:init_it/6 (gen_server.erl, line 304) 
    in call from proc_lib:init_p_do_apply/3 (proc_lib.erl, line 227) 

回答

4

这里发生的事情是,meck:new产生一个新的进程(使用meck_proc下的gen_server过程allback模块),并且该进程退出时出现undefined_module错误。 (你可以通过将non_strict选项传递给meck:new来获得它。)这个新进程是链接到调用进程,这意味着退出信号将被发送到调用进程,并且调用进程将退出也没有能够catch的信号。

您可避免通过使您的通话过程中的陷阱退出:

process_flag(trap_exit, true) 

这将会把退出信号到一个消息,你可以receive;有关更多详细信息,请参阅the manual。但是,作为一般规则,您应该避免陷阱出口,因为它会使错误处理更加复杂(而不是默认的“崩溃,重新启动”)。