Handles errors from an upstream publisher by replacing it with another publisher.
SDKs
- iOS 13.0+
- macOS 10.15+
- Mac Catalyst 13.0+
- tvOS 13.0+
- watchOS 6.0+
- Xcode 11.0+
Framework
- Combine
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
.