Generic Instance Method

catch(_:)

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

Declaration

func `catch`<P>(_ handler: @escaping (Self.Failure) -> P) -> Publishers.Catch<Self, 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

Use catch(_:) to replace an error from an upstream publisher with a new publisher.

In the example below, the catch(_:) operator handles the SimpleError thrown by the upstream publisher by replacing the error with a Just publisher. This continues the stream by publishing a single value and completing normally.

struct SimpleError: Error {}
let numbers = [5, 4, 3, 2, 1, 0, 9, 8, 7, 6]
cancellable = numbers.publisher
    .tryLast(where: {
        guard $0 != 0 else {throw SimpleError()}
        return true
    })
    .catch({ (error) in
        Just(-1)
    })
    .sink { print("\($0)") }

// Prints: -1

See Also

Handling Errors

func assertNoFailure(String, file: StaticString, line: UInt) -> Publishers.AssertNoFailure<Self>

Raises a fatal error when its upstream publisher fails, and otherwise republishes all received input.

func tryCatch<P>((Self.Failure) -> P) -> Publishers.TryCatch<Self, P>

Handles errors from an upstream publisher by either replacing it with another publisher or throwing a new error.

func retry(Int) -> Publishers.Retry<Self>

Attempts to recreate a failed subscription with the upstream publisher up to the number of times you specify.