是否可以在不停止我的程序的情况下调用内部调用 `halt()` 的函数?

Is it possible to call a function which internally calls `halt()` without halting my program?

我正在尝试使用库中的函数。我尝试使用的函数是在内部调用 erlang:halt()。所以它会停止虚拟机,我的程序也会退出。无论如何我可以在不退出我的程序的情况下调用这个函数吗?

这是试图调用的函数,它来自 erlscp。我面临的问题是此调用后没有执行任何操作。我想知道修改这个库是唯一的方法吗?

-spec compile_cmdline([cmd_line_arg()]) -> no_return().

compile_cmdline(List) ->
    case compile(List) of
    ok -> my_halt(0);
    error -> my_halt(1);
    _ -> my_halt(2)
    end.

-spec my_halt(_) -> no_return().
my_halt(Reason) ->
    erlang:halt(Reason).

修改库是唯一的方法。

您有时可以使用 the meck library 或类似的技巧来替换模块或模块中的单个函数,但这不适用于与语言本身紧密绑定的 erlang 模块.

您可以尝试模拟 my_halt 函数,但在这种情况下不会有任何效果,因为 compile_cmdline 使用 [=] 对 my_halt 进行本地调用14=] 而不是 erl_compile2:my_halt(0)。只能使用 meck 模拟对导出函数的模块限定调用。