A try
не может перехватить исключение в async
при выполнении с Async.Start
, поскольку они разветвляются в разных потоках. Если вы хотите поймать его, вы можете сделать это с помощью Async.RunSynchronously
или внутри другого async
:
let throwAsync = async { failwith "I was not caught!" }
let catchAsync = async {
try
do! throwAsync
with _-> printfn "caught inside async!"
}
[<EntryPoint>]
let main argv =
try throwAsync |> Async.RunSynchronously
with _ -> printfn "caught outside!"
try catchAsync |> Async.Start
with _ -> printfn "I did not catch it either!"
System.Console.Read() |> ignore
printfn "finishing!"
0
выход:
caught outside!
caught inside async!
finishing!