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

2 回答 2

0

从错误消息中可以清楚地看出,从返回的值rfc4627:decode/1应该很容易与三元组匹配。所以这不是问题

您的问题可能与函数调用中某些“其他”变量的模式匹配有关。特别是如果您之前RequestData定义过,那么您只需将之前的值与从rfc4627:decode/1.

还值得一提的是,虽然_将与任何东西进行模式匹配(或者如果您愿意,也不会进行模式匹配),但以下划线开头的变量(如_Reminder将进行模式匹配(如果它们未使用,它们不会给您警告)。

编辑

如果你看一下=Erlang 中的 operator,它可能意味着两种不同的东西。它可以是赋值或模式匹配,或者在你的情况下两者兼而有之(你试图做的是在okatom 上进行模式匹配,同时为 分配新值RequestData)。因此,取决于是否ReqestData被绑定(已经有一些价值,或者没有)你会有不同的行为。

假设你打电话时ReqestData已经绑定了{ok,RequestData,_} = rfc4627:decode(Arg#arg.clidata)。在这种情况下,我们只是模式匹配(比较)由返回decode并分配给的值ReqestData,它可以通过也可以失败。例如,它可以绑定到nullor false,这是可以由 . 返回的值decode。而且由于这一切都取决于您从系统之外获取的数据,因此它可以解释有时通过/有时失败的行为。

于 2014-04-22T12:09:43.147 回答
0

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

于 2014-04-28T06:42:47.250 回答