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.OutputParameters
- 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: -1Backpressure note: This publisher passes through request and cancel to the upstream. After receiving an error, the publisher sends sends any unfulfilled demand to the new Publisher. SeeAlso: replaceError