---
title: "catch(_:)"
framework: combine
role: symbol
role_heading: Instance Method
path: "combine/publisher/catch(_:)"
---

# catch(_:)

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

## Declaration

```swift
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

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

## Discussion

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 Backpressure 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

## See Also

### Handling errors

- [assertNoFailure(_:file:line:)](combine/publisher/assertnofailure(_:file:line:).md)
- [tryCatch(_:)](combine/publisher/trycatch(_:).md)
- [retry(_:)](combine/publisher/retry(_:).md)
