我目前正在用phoenix构建一个跳棋游戏,该游戏进入了“ FunctionClauseError”。错误是由我在此处提供的游戏频道中的“ handle_in”函数引发的:
def handle_in("click", %{"click" => ll}, socket) do
IO.puts("whatever")
end
关于我们在做什么错的任何想法吗?
答案 0 :(得分:1)
这是一个例子:
defmodule Example do
def run() do
Demo.handle_in("UNEXPECTED", "foo", "bar")
end
def handle_in("click", map, socket) do
IO.puts("whatever")
end
end
这是我们致电run/0
时的错误消息:
iex(1)> Example.run
** (FunctionClauseError) no function clause matching in Example.handle_in/3
The following arguments were given to Example.handle_in/3:
# 1
"UNEXPECTED"
# 2
"foo"
# 3
"bar"
从此输出中可以看到,run/1
以handle_in/3
作为第一个参数调用"UNEXPECTED"
。 handle_in
中没有子句会期望这样做,因此elixir会生成错误。如果无法控制输入,处理此问题的常用方法是添加一个不与参数模式匹配的包罗万象的子句:
def handle_in("click", map, socket) do
IO.puts("clicked")
end
def handle_in(one, two, three) do
IO.puts("Called with: #{inspect one}, #{inspect two}, #{inspect three}")
end
现在不会产生错误,因为第二个子句可以处理"UNEXPECTED"
字符串:
iex(1)> Example.run
Called with: "UNEXPECTED", "foo", "bar"
:ok
在您的情况下,可能是未传递"click"
字符串,或者第二个参数不是包含"click"
键的映射,但没有调用代码或错误消息,这是不可能的。