{ok,RequestData,_} = rfc4627:decode(Arg#arg.clidata)
与
的输出匹配时 rfc4627:decode(Arg#arg.clidata)
到
{ok,RequestData,_}
它会出现{badmatch,....}错误
但我在错误消息中复制了输出并与
匹配 {ok,RequestData,_}
在erlang shell中,然后匹配没有任何错误。
此错误只会随机发生。我无法弄清楚原因。有时匹配和代码工作没有任何错误。有时它会产生错误并导致代码崩溃。
这是错误消息
<h2>Internal error, yaws code crashed</h2><br /><hr />
<pre>
ERROR erlang code threw an uncaught exception:
File: /usr/local/var/yaws/www/prime/yaws/session.yaws:1
Class: error
Exception: {badmatch,{ok,{obj,[{"action",<<"GET_SESSION_INFO">>}]},[]}}
Req: {http_request,'POST',{abs_path,"/prime/yaws/session.yaws"},{1,1}}
Stack: [{session,handle,2,
[{file,"/root/.yaws/yaws/default/session.erl"},{line,30}]},
{yaws_server,deliver_dyn_part,8,
[{file,"yaws_server.erl"},{line,2801}]},
{yaws_server,aloop,4,[{file,"yaws_server.erl"},{line,1215}]},
{yaws_server,acceptor0,2,[{file,"yaws_server.erl"},{line,1052}]},
{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,239}]}]
</pre><hr />
答案 0 :(得分:0)
从错误消息中可以清楚地看出,rfc4627:decode/1
返回的值应该很容易与三元组匹配。所以这不是问题
您的问题可能是在函数调用中使用模式匹配某些“其他”变量。特别是如果您之前定义了RequestData
,那么您只需将之前的值与rfc4627:decode/1
返回的值进行比较即可。
值得一提的是,虽然_
将与任何内容进行模式匹配(或者如果您愿意,也不会模式匹配),但以下划线开头的变量(如_Reminder
)将< / strong>模式匹配(如果它们未被使用,它们就不会给你警告。)
如果你在Erlang中查看=
运算符,它可能意味着两件事。它可以是赋值或模式匹配,或者两者都在你的情况下(你要做的是在ok
atom上进行模式匹配,同时为RequestData
分配新值。因此,取决于ReqestData
是否受约束(已经具有某种价值或不具有某种价值),您将有不同的行为。
我假设,当您致电ReqestData
时{ok,RequestData,_} = rfc4627:decode(Arg#arg.clidata)
已被绑定。在这种情况下,我们只是模式匹配(比较)由decode
返回并分配给ReqestData
的值,它可以通过也可以失败。例如,它可以绑定到null
或false
,这些值可以由decode
返回。而且由于这一切都取决于你在系统之外的数据,它可以解释某些时候通过/有时失败的行为。
答案 1 :(得分:0)
最后我发现了这个问题。我在同一台服务器上有2个不同的接口,它们都使用相同的文件名相同的文件。但内部的代码有点不同。那就是问题所在。当我转到一个界面时,它会动态编译偏航并在临时路径中创建一个erl文件。然后,如果我尝试转到另一个接口,它不会再次编译偏航,而是从另一个接口引用相同的erl文件,因为两个文件具有相同的名称。当它尝试匹配来自接口的请求数据时发生错误。因为这2个接口以2种不同的格式发送请求数据。