编译时未检测到大小写错误的模块名,运行时触发UndefinedFunctionError
Elixir运行时UndefinedFunctionError问题排查
问题代码
def ping(servoId) do Utilities.check_integer!(servoId,0,1,Error.const_error_servo_id()) Genserver.call(@name,{:ping,servoId}) end
运行时报错信息
iex(3)> Mechanics.Servo.ping(1) 03:41:01.629 [error] 加载 /Users/yuchen/homebrew/Cellar/elixir/1.13.4/bin/../lib/elixir/ebin/Elixir.Genserver.beam 失败: :badfile 03:41:01.629 [error] beam/beam_load.c(158): 加载模块 'Elixir.Genserver' 出错: 目标代码中的模块名为 'Elixir.GenServer' ** (UndefinedFunctionError) 函数 Genserver.call/2 未定义(模块 Genserver 不可用) Genserver.call(Mechanics.Servo, {:ping, 1})
问题原因
Elixir是大小写敏感语言,官方进程通信模块的正确名称是GenServer(第二个字母S大写),但你代码里写成了小写s的Genserver,导致运行时找不到对应模块。
编译器未报错是因为Elixir允许引用尚未定义的模块(视为运行时动态加载模块),但实际运行时系统中不存在Genserver这个模块,因此抛出UndefinedFunctionError。
解决方法
修正模块名拼写,将Genserver.call改为GenServer.call即可:
def ping(servoId) do Utilities.check_integer!(servoId,0,1,Error.const_error_servo_id()) GenServer.call(@name,{:ping,servoId}) end
内容的提问来源于stack exchange,提问作者Chen Yu
相关产品推荐
相关产品推荐

