【问题标题】:Erlang uncatchable exceptionErlang 无法捕获的异常
【发布时间】:2014-06-23 08:48:16
【问题描述】:

我在 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”子句都没有被执行,所以它对我来说更像是一个错误):

** 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)

【问题讨论】:

    标签: exception-handling erlang


    【解决方案1】:

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

    你可以通过让你的调用进程陷阱退出来避免这种情况:

    process_flag(trap_exit, true)
    

    这会将退出信号转换为您可以receive的消息;有关详细信息,请参阅the manual。但是,作为一般规则,您应该避免捕获退出,因为它会使错误处理更加复杂(与默认的“崩溃,重新启动”相反)。

    【讨论】:

      猜你喜欢
      • 2010-10-29
      • 1970-01-01
      • 2011-04-19
      • 2021-10-09
      • 2021-09-17
      • 2021-10-03
      • 2018-02-04
      • 2018-02-04
      相关资源
      最近更新 更多