catch

AsyncResult.catch

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.

Function Signature:

(exn -> 'error) -> Async<Result<'ok, 'error>> -> Async<Result<'ok, 'error>>

Examples

Example 1

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"

Example 2

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)

Example 3

When no exception is thrown, the result passes through unchanged:

Last updated