如何在Elixir中处理损坏的STDOUT管道?

时间:2016-06-21 18:14:40

标签: elixir

此Elixir脚本输出一些数字。

# output_numbers.exs
(1..1_000) |> Enum.each(fn (i) ->
  IO.puts i
end)

如果我运行elixir output_numbers.exs | head -10,则会收到错误消息:

** (ErlangError) erlang error: :terminated

我认为这是因为head -10一旦有10行就关闭了STDIN管道。

在这种情况下如何优雅地终止?

1 个答案:

答案 0 :(得分:1)

救援ErlangError

这是rescue实际上派上用场的情况。我们可以使用此函数代替IO.puts i

  # For example, if user is piping STDOUT to `head -10`
  defp puts_unless_pipe_closed(data) do
    try do
      IO.puts(data)
    rescue
      ErlangError -> exit(:shutdown)
    end
  end

此处exit(:shutdown)exiting quietly的一种方式。