Escript中function_exported?/3异常:无法正确检测Code.format_string!/2存在性
解决Escript中
function_exported?/3检测Code.format_string!/2异常的问题 我之前也踩过类似的坑,你的情况本质是模块加载时机导致的:
在escript运行环境中,function_exported?/3是偏底层的检查函数,它不会自动触发Elixir模块的加载。当你调用它检测Code.format_string!/2时,Code模块可能还没被系统加载,所以返回false;但当你直接调用Code.format_string!/2时,Elixir的自动加载机制会立即加载Code模块,所以函数能正常执行。
给你几个可行的解决方案:
方案1:先确保模块加载再检查
先通过Code.ensure_loaded/1强制加载模块,再进行检测:
def supports_format_string? do case Code.ensure_loaded(Code) do {:module, Code} -> function_exported?(Code, :format_string!, 2) {:error, _reason} -> false end end
方案2:用Module.defines?/2替代检查
Module.defines?/2是Elixir提供的更友好的检查函数,它会自动确保模块加载,无需额外处理:
Module.defines?(Code, {:format_string!, 2})
方案3:直接尝试调用(简单粗暴但有效)
如果场景简单,可以直接尝试调用函数,通过捕获异常判断是否支持:
def supports_format_string? do try do Code.format_string!("") true rescue UndefinedFunctionError -> false end end
简单总结下:escript为了启动效率,不会预加载所有核心模块,function_exported?/3又不会触发加载,才导致了这种"检测不到但能调用"的矛盾情况。上面的方案都能解决这个问题,你可以根据自己的代码场景选择最合适的。
内容的提问来源于stack exchange,提问作者Tony Han
相关产品推荐
相关产品推荐

