Erlang, register/2: 异常错误错误参数

Posted

技术标签:

【中文标题】Erlang, register/2: 异常错误错误参数【英文标题】:Erlang, register/2: exception error bad argument 【发布时间】:2016-05-04 17:21:39 【问题描述】:

我想编写创建 2 个进程的程序。 第一个打印号码,将其发送到第二个过程,依此类推。 但是我的启动功能有问题。

-module(zad).

-export([start/0, one/0, two/0]).

one() ->
    receive
        go1, N ->
            io:format("1 ~w~n", [N]),
            two ! go2, N+1,
            one();
        go2, 50 ->
            io:format("END ~w~n", [N+1]),
            two ! finished
    end.

two() ->
    receive
        finished ->
            io:format("two finished~n", []);
        go2, N ->
            io:format("2 ~w~n", [N]),
            one ! go1, N+1 ,
            two()
    end.

start() -> 
    register(two, spawn(zad, two, [])),
    register(one, spawn(zad, one, [])),
    one ! go1, 0.

这里有错误

** exception error: bad argument
 in function  register/2
    called as register(two,<0.146.0>)
 in call from zad:start/0 (zad.erl, line 29)

这是否意味着我不能在启动时注册 2 个进程?这段代码有什么问题?

更新 这真的很奇怪。但是在我改变之后

go2, 50 -> io:format("END ~w~n", [N+1]),

go2, 50 -> io:format("END ~w~n", [50]),

错误消失了。 这真的很奇怪,因为问题在one(),但错误在register(two)

【问题讨论】:

也许two/0 也有语法错误?也许 two/0 的更改尚未编译,当您为 one/0 重新编译时,它已得到纠正? 你尝试过多少次运行这个?如果您在没有取消注册名称的情况下再次运行它,那么当您尝试重新注册名称时会出错,因为该名称已在使用中。 【参考方案1】:

您可以在start/0 中注册两个进程。这意味着您传递给register/2 的值是错误的。来自文档(http://erlang.org/doc/man/erlang.html#register-2):

失败:

badarg 如果 PidOrPort 不是现有的本地进程或端口。 badarg 如果 RegName 已在使用中。 badarg 如果进程或端口已经注册(已经有名字)。 badarg 如果 RegName 是原子 undefined

很可能发生的情况是进程在调用register/2 之前就死了(请参阅上面列表中的第一个失败)。

【讨论】:

以上是关于Erlang, register/2: 异常错误错误参数的主要内容,如果未能解决你的问题,请参考以下文章

Erlang - **异常错误:右侧值不匹配

右侧值不匹配的 Erlang 异常错误

为什么语法错误会出现在erlang spawn函数调用中 - “语法错误之前:')'”?

Erlang中除以零的精确异常类型

rabbitmq编译部署以及常见报错

Erlang:为什么这会以'badarith'异常失败?