首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Erlang不可捕捉的异常

Erlang不可捕捉的异常
EN

Stack Overflow用户
提问于 2014-05-06 16:11:55
回答 1查看 160关注 0票数 1

我在Erlang中有以下代码,其中我正在处理一个不存在的模块。在Erlang/meck的某些版本中,这会产生一个异常,这种异常似乎难以捕捉。

有人知道Erlang中是否有“不可捕捉的异常”功能吗?

代码语言:javascript
复制
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 ):

代码语言:javascript
复制
** 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“表达式,其结果是相同的:

代码语言:javascript
复制
> 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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-06 16:26:20

这里发生的情况是,meck:new生成一个新进程(使用meck_proc回调模块的gen_server进程),该进程以undefined_module错误退出。(您可以通过将non_strict选项传递给meck:new来避免这样做。)这个新进程被链接到调用进程,这意味着退出信号将被发送到调用进程,并且调用进程也将退出,而不能够catch信号。

通过使调用进程陷阱退出,可以避免这种情况:

代码语言:javascript
复制
process_flag(trap_exit, true)

这将将退出信号转换为您可以receive的消息;有关更多细节,请参见手册。但是,作为一般规则,您应该避免捕获出口,因为它使错误处理变得更加复杂(相对于默认的“崩溃,重新启动”)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23499782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档