2016-08-15 2 views
5

У меня есть следующий код. И я хочу бежать, не блокируя основной поток.Захват исключения в Async.Start?

let post() = ..... 
try 
    let response = post() 
    logger.Info(response.ToString()) 
with 
| ex -> logger.Error(ex, "Exception: " + ex.Message) 

Поэтому я изменил код на следующее. Однако, как поймать исключение в post?

let post = async { 
    .... 
    return X } 
try 
    let response = post |> Async.StartChild 
    logger.Info(response.ToString()) 
with 
| ex -> logger.Error(ex, "Exception: " + ex.Message) 

ответ

1

Вы бы поставить попробовать/поймать в async блоке, а

let post = async { .... } 
async { 
    try 
    let! response = post 
    logger.Info(response.ToString()) 
    with 
    | ex -> logger.Error(ex, "Exception: " + ex.Message) 
} |> Async.Start 
2

Один из способов - использовать Async.Catch в вызове рабочего процесса. Учитывая пару функций (холостой функции "асинхронной" и что-то, чтобы работать с результатом):

let work a = async { 
    return 
     match a with 
     | 1 -> "Success!" 
     | _ -> failwith "Darnit" 
} 

let printResult (res:Choice<'a,System.Exception>) = 
    match res with 
    | Choice1Of2 a -> printfn "%A" a 
    | Choice2Of2 e -> printfn "Exception: %s" e.Message 

One can use Async.Catch

let callingWorkflow = 
    async { 
     let result = work 1 |> Async.Catch 
     let result2 = work 0 |> Async.Catch 

     [ result; result2 ] 
     |> Async.Parallel 
     |> Async.RunSynchronously 
     |> Array.iter printResult 
    } 

callingWorkflow |> Async.RunSynchronously 

Async.Catch возвращает Choice<'T1,'T2>. Choice1Of2 для успешного выполнения, а также исключение для Choice2Of2.

Смежные вопросы