Elixir:救援/捕获任务超时

时间:2017-12-22 21:10:43

标签: elixir

我有以下代码:

try do
  IO.inspect("start task")
  t = Task.async(fn -> Process.sleep(7000)  end)
  IO.inspect("start awaiting")
  Task.await(t)
rescue
  e ->
    IO.inspect("catch error")
    IO.inspect(e)
after
  IO.inspect("after")
end
IO.inspect("success ending")

那将打印:

"start task"
"start awaiting"
"after"

00:00:03.510 [info]  Application my_app exited: exited in: MyApp.Application.start(:normal, [])
** (EXIT) exited in: Task.await(%Task{owner: #PID<0.497.0>, pid: #PID<0.498.0>, ref: #Reference<0.3923892342.570949633.190577>}, 5000)
    ** (EXIT) time out

所以等待崩溃我的来电程序,我无法通过某种方式拯救错误,并且&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;&#34;使用块。我不明白如何保护我的调用者进程免于任务超时错误。

1 个答案:

答案 0 :(得分:6)

您将要在此特定实例中使用try/catch

try do
  IO.inspect("start task")
  t = Task.async(fn -> Process.sleep(7000)  end)
  IO.inspect("start awaiting")
  Task.await(t)
catch
  :exit, _ -> IO.puts "caught exit"
after
  IO.inspect("after")
end
IO.inspect("success ending")
"start task"
"start awaiting"
caught exit
"after"
"success ending"

两者之间的差异可以在不同的地方找到。 This question可能是一个好的开始。