是否可以在不停止我的程序的情况下调用内部调用 `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 模拟对导出函数的模块限定调用。
我正在尝试使用库中的函数。我尝试使用的函数是在内部调用 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 模拟对导出函数的模块限定调用。