【问题标题】:Gracefully terminating an Erlang server or fsm?优雅地终止 Erlang 服务器或 fsm?
【发布时间】:2010-10-04 20:00:51
【问题描述】:

我有一个具有 gen_fsm 行为的模块。现在我通过在适当的状态/消息中返回标准 {stop, Reason, State} 来终止它。

它似乎正确终止,但在运行时被认为是错误。

这正常吗?有没有办法停止 fsm 进程而不会被视为错误?

【问题讨论】:

    标签: erlang


    【解决方案1】:

    返回值是 {stop,Reason,StateData} 而不是 {stop,StateName,StateData}。

    如果原因不是正常或关闭,则会生成错误报告。对于服务器的正常退出,请使用 normal,当服务器被其主管要求退出时使用 shutdown。

    (现在编辑已添加错误详细信息。)

    gen_fsm 正在呼叫client_fsm:terminate(normal, loggedin, {state,#Port<0.144>,12345,"Bob"})

    导致 function_clause 异常(该函数存在,但没有子句可以与这些参数匹配)。如果您更改 client_fsm:terminate/3 以使调用成功,则错误应该消失。

    【讨论】:

    • 是的,我指的是 Reason 而不是 StateName。无论如何,你回答了我的问题;谢谢。
    • 对不起,即使我明确使用了原子法线,它仍然会产生错误。
    • 啊,我完全明白我做错了什么。尽管您完美地回答了我的答案,但我的第二个错误仍然产生了错误。我将删除关于我的第二个错误的部分内容,以便手头的问题可以让其他人看到。
    • 真的吗?我想说它们是很多人会依次遇到的两个错误。我当然确实测试了我的初始解决方案。我认为整个序列在这里很有用。作为一般提示,习惯于阅读错误崩溃消息 - 它们很神秘,但包含大量信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多