2017-12-22 8 views
0

Ich habe den folgenden Code:Elixir: Rettung/catch Aufgabe Timeout

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") 

Das gedruckt wird:

"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 

So erwarten stürzt mein Anrufer Prozess, und ich kann den Fehler nicht retten, indem irgendwie der "after" Block benutzt wird. Ich verstehe nicht, wie ich meinen Aufrufer vor einem Task-Timeout-Fehler schützen kann.

Antwort

3

Sie werden try/catch in diesem bestimmten Fall verwenden möchten.

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" 

Die Unterschiede zwischen den beiden kann in verschiedenen Orten. This question kann ein guter Anfang sein.