【问题标题】:Strange Error occurance in Erlang rfc4627Erlang rfc 4627 中出现奇怪的错误
【发布时间】:2014-06-06 17:27:22
【问题描述】:
    {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 />

【问题讨论】:

  • 如果有人知道发生了什么请帮助我......???
  • 请尝试{ok, _RequestData, _}

标签: erlang yaws rfc4627


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    编辑

    如果您查看 Erlang 中的 = 运算符,它可能意味着两种不同的东西。它可以是赋值或模式匹配,或者两者兼而有之(你想要做的是ok atom 上的模式匹配,同时为RequestData 分配新值)。所以,取决于ReqestData 是否被绑定(已经有一些价值,或者没有)你会有不同的行为。

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

    【讨论】:

    • 是的,我了解您提供的所有事实。但是同样的代码怎么可能一次出错,而在其他时候工作却没有错误。这就是我不明白的地方。
    • 我已经编辑了我的原始消息,因为我的回复无法满足评论限制。如果仍有不清楚的地方,请分享您的其余代码(整个函数)。在这一点上,我在假设和猜测,也许如果我能在你的代码中指出错误,我的解释会更清楚。
    • 我终于找到了问题所在。我在同一服务器中有 2 个不同的接口,它们都使用具有相同文件名的相同文件。但里面的代码有点不同。那就是问题所在。当我转到一个界面时,它会动态编译 yaws 并在临时路径中创建一个 erl 文件。然后,如果我尝试转到另一个界面,它不会再次编译 yaws,而是从另一个界面引用相同的 erl 文件,因为两个文件具有相同的名称。
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多