Saga Error Handling Patterns

Provide examples of common error handling patterns in Redux-Saga, focusing on try/catch blocks within sagas to gracefully manage exceptions.
function* fetchResource(resource) {
  try {
    const response = yield call(api.fetch, resource);
    yield put({ type: 'FETCH_SUCCESS', payload: response });
  } catch (error) {
    yield put({ type: 'FETCH_FAILURE', payload: error.message });
This code defines a saga generator function named fetchResource. It attempts to fetch a resource using an asynchronous API call within a try block. If the API call succeeds, a FETCH_SUCCESS action is dispatched with the response payload. If the API call fails, a catch block captures the error, and a FETCH_FAILURE action is dispatched with the error message.
function* watchFetchRequests() {
  while (true) {
    const action = yield take('FETCH_REQUEST');
    yield fork(fetchResource, action.payload);
This watcher saga waits for FETCH_REQUEST actions. Upon receiving one, it forks a new task to handle the fetch operation by calling the fetchResource saga with the payload of the FETCH_REQUEST action. Using fork allows multiple fetch requests to be handled concurrently.