Generic Instance Method

catch(_:)

Handles errors from an upstream publisher by replacing it with another publisher.

Declaration

func `catch`<P>(_ handler: @escaping (Upstream.Failure) -> P) -> Publishers.Catch<Publishers.Map<Upstream, Output>, P> where P : Publisher, Self.Output == P.Output

Parameters

handler

A closure that accepts the upstream failure as input and returns a publisher to replace the upstream publisher.

Return Value

A publisher that handles errors from an upstream publisher by replacing the failed publisher with another publisher.

Discussion

The following example replaces any error from the upstream publisher and replaces the upstream with a Just publisher. This continues the stream by publishing a single value and completing normally.

enum SimpleError: Error { case error }
let errorPublisher = (0..<10).publisher().tryMap { v -> Int in
    if v < 5 {
        return v
    } else {
        throw SimpleError.error
    }
}

let noErrorPublisher = errorPublisher.catch { _ in
    return Publishers.Just(100)
}

Backpressure note: This publisher passes through request and cancel to the upstream. After receiving an error, the publisher sends any unfulfilled demand to the new Publisher.