【问题标题】:Elixir: rescue/catch task timeoutElixir:救援/捕获任务超时
【发布时间】:2018-06-05 10:59:37
【问题描述】:

我有以下代码:

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

所以 await 使我的调用者进程崩溃,并且我无法通过使用“after”块来挽救错误。我不明白如何保护我的调用者进程免受任务超时错误的影响。

【问题讨论】:

    标签: elixir


    【解决方案1】:

    您将希望在此特定实例中使用 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 可能是一个好的开始。

    【讨论】:

      猜你喜欢
      • 2017-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多