Erlang rfc4627中发生奇怪错误

时间:2014-04-22 11:16:07

标签: erlang yaws rfc4627

    {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 />

2 个答案:

答案 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的值,它可以通过也可以失败。例如,它可以绑定到nullfalse,这些值可以由decode返回。而且由于这一切都取决于你在系统之外的数据,它可以解释某些时候通过/有时失败的行为。

答案 1 :(得分:0)

最后我发现了这个问题。我在同一台服务器上有2个不同的接口,它们都使用相同的文件名相同的文件。但内部的代码有点不同。那就是问题所在。当我转到一个界面时,它会动态编译偏航并在临时路径中创建一个erl文件。然后,如果我尝试转到另一个接口,它不会再次编译偏航,而是从另一个接口引用相同的erl文件,因为两个文件具有相同的名称。当它尝试匹配来自接口的请求数据时发生错误。因为这2个接口以2种不同的格式发送请求数据。