Namespace: FsToolkit.ErrorHandling
Catches exceptions thrown by an async computation and maps them to the Error case using the provided function. If the async computation completes successfully with an Ok or Error value, that value is returned unchanged.
(exn -> 'error) -> Async<Result<'ok, 'error>> -> Async<Result<'ok, 'error>>Catching any exception and converting it to a string error:
let result : Async<Result<int, string>> =
async { return failwith "something went wrong" }
|> Async.map Ok
|> AsyncResult.catch (fun ex -> ex.Message)
// evaluates to Error "something went wrong"Wrapping a potentially throwing async call in an AsyncResult:
let safeFetch (url: string) : Async<Result<string, string>> =
async {
use client = new System.Net.Http.HttpClient()
return! client.GetStringAsync(url) |> Async.AwaitTask |> Async.map Ok
}
|> AsyncResult.catch (fun ex -> sprintf "HTTP error: %s" ex.Message)When no exception is thrown, the result passes through unchanged:
AsyncResult.ok 42
|> AsyncResult.catch (fun _ -> "error")
// evaluates to Ok 42