2017-12-22 8 views
0

나는 다음과 같은 코드가 있습니다비약 : 구조/캐치 태스크 시간 초과

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 

그래서 기다리고

내 호출자 프로세스를 충돌, 나는 오류를 구출하지 수, 여하튼 "after"블록이 사용됩니다. 발신자 프로세스를 작업 시간 초과 오류로부터 보호 할 수있는 방법을 이해할 수 없습니다.

답변

3

이 경우에는 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이 좋은 시작일 수 있습니다.