我在Erlang中有以下代码,其中我正在处理一个不存在的模块。在Erlang/meck的某些版本中,这会产生一个异常,这种异常似乎难以捕捉。
有人知道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.当我执行这段代码时,这就是我得到的结果(请注意,即使是"after“子句也没有被执行,所以在我看来它更像是一个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“表达式,其结果是相同的:
> 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)发布于 2014-05-06 16:26:20
这里发生的情况是,meck:new生成一个新进程(使用meck_proc回调模块的gen_server进程),该进程以undefined_module错误退出。(您可以通过将non_strict选项传递给meck:new来避免这样做。)这个新进程被链接到调用进程,这意味着退出信号将被发送到调用进程,并且调用进程也将退出,而不能够catch信号。
通过使调用进程陷阱退出,可以避免这种情况:
process_flag(trap_exit, true)这将将退出信号转换为您可以receive的消息;有关更多细节,请参见手册。但是,作为一般规则,您应该避免捕获出口,因为它使错误处理变得更加复杂(相对于默认的“崩溃,重新启动”)。
https://stackoverflow.com/questions/23499782
复制相似问题