Elixir GenServer.start_链接引发异常,而不是返回元组

Elixir GenServer.start_链接引发异常,而不是返回元组,elixir,gen-server,Elixir,Gen Server,我在玩一点,实现自定义init回调时遇到问题 请考虑以下代码: defmodule GenS do use GenServer def start_link(initial \\ 0) do GenServer.start_link(__MODULE__, initial) end def init(initial) do case initial do 3 -> {:stop, "Can't initialise with 3"}

我在玩一点,实现自定义
init
回调时遇到问题

请考虑以下代码:

defmodule GenS do
  use GenServer

  def start_link(initial \\ 0) do
    GenServer.start_link(__MODULE__, initial)
  end

  def init(initial) do
    case initial do
      3 -> {:stop, "Can't initialise with 3"}
      _ -> {:ok, initial}
    end
  end
end

case GenS.start_link(3) do
  {:error, reason} -> IO.puts "Failed with #{reason}"
  {:ok,    _}      -> IO.puts "This has worked!"
end

IO.puts "I'm still alive!"
执行此代码时,我可以看到输出:

▶ elixir gens.ex
** (EXIT from #PID<0.46.0>) "Can't initialise with 3"
根据以下文件:

如果
init/1
回调因原因失败,则此函数返回
{:error,reason}
。否则,如果返回
{:stop,reason}
:ignore
,则进程终止,此函数分别返回
{:error,reason}
:ignore

我希望元组会再次返回,我可以用patter匹配,但事实似乎并非如此。你有什么建议吗

我希望元组会再次返回,我可以用patter匹配,但事实似乎并非如此。你有什么建议吗

这里的问题是,您将链接到生成的进程,并从
init返回
{:stop,…}
将向调用进程发送退出信号,默认情况下会终止调用进程

您可以切换到使用
GenServer.start
(并在以后手动链接进程,如果您愿意),或者在启动
GenS
之前通过运行以下命令捕获退出信号:

Process.flag(:trap_exit, true)
(请注意,当
GenS
死亡时,这将向调用进程发送一条消息,您可能希望丢弃该消息以防止浪费内存。)

在这两种情况下,我得到以下输出:

Failed with Can't initialise with 3
I'm still alive!

那很有趣。谢谢分享。结果证明,文档听起来很混乱——基于此,我希望得到一些我可以安全匹配的结果。。。
Failed with Can't initialise with 3
I'm still alive!