此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
管道。
在这种情况下如何优雅地终止?
答案 0 :(得分:1)
这是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的一种方式。