我在调试Erlang聊天引擎时不断收到异常错误。错误消息显示:
exception error: no function clause matching code_lock:locked(cast, {button,1}, #{button => [], code => [a,b,c,d], length => 4})
知道怎么调试吗?
ccgok5k51#
函数locked被定义了(异常还应该告诉你它的定义从哪个while和哪一行开始),但是没有一个子句与异常中显示的参数匹配。例如,如果我们定义
locked
nfcm([H|T],X) -> [H,X|T]; nfcm({A,B},C) -> {A,C,B}.
我们可以调用nfcm([1,2,3], 4)和nfcm({1,2}, 3)来得到[1,4,2,3]和{1,3,2},但是调用nfcm(1, 2)或nfcm({1,2,3}, 4)会导致异常,因为1既不匹配列表也不匹配元组,{1,2,3}既不匹配列表,也不匹配包含两个元素的元组。有两种方法可以解决这个问题:修复函数的定义,或修复参数以匹配现有定义。
nfcm([1,2,3], 4)
nfcm({1,2}, 3)
[1,4,2,3]
{1,3,2}
nfcm(1, 2)
nfcm({1,2,3}, 4)
1
{1,2,3}
tag5nh1u2#
好的,这与参数匹配现有定义有关。排序后,调试过程就可以了。
2条答案
按热度按时间ccgok5k51#
函数
locked
被定义了(异常还应该告诉你它的定义从哪个while和哪一行开始),但是没有一个子句与异常中显示的参数匹配。例如,如果我们定义
我们可以调用
nfcm([1,2,3], 4)
和nfcm({1,2}, 3)
来得到[1,4,2,3]
和{1,3,2}
,但是调用nfcm(1, 2)
或nfcm({1,2,3}, 4)
会导致异常,因为1
既不匹配列表也不匹配元组,{1,2,3}
既不匹配列表,也不匹配包含两个元素的元组。有两种方法可以解决这个问题:修复函数的定义,或修复参数以匹配现有定义。
tag5nh1u2#
好的,这与参数匹配现有定义有关。排序后,调试过程就可以了。