JavaScript Promise.catch() — обробка помилки обіцянки


Метод catch() (у перекладі — ловити) виконує функцію, коли обіцянка відхилена — тобто сталася помилка.

автор: NagarD

Загальний опис

Помилка в ланцюжку поводиться як м'яч, що котиться донизу: вона пропускає всі then і зупиняється в першому catch. Тому один catch() у кінці ловить збій із будь-якої ланки — окремий обробник після кожного кроку не потрібен.

Після catch() ланцюжок оживає: якщо обробник повернув значення, наступні then виконаються як ні в чому не бувало. Це дозволяє підставити запасні дані замість помилки й піти далі.

І головна пастка: обіцянка без жодного catch проковтне помилку тихо. Браузер напише в консоль «unhandled rejection», але код нічого не помітить.

автор: NagarD

Нотатка

У fetch catch ловить лише збій мережі. Відповідь 404 чи 500 — це успішна обіцянка: сервер відповів. Статус треба перевіряти самому через response.ok.

автор: NagarD

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
catch 32+ 29+ 8+ 19+ 12+ -
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
catch 32+ yes yes 8+

Приклади

+ запропонувати свій приклад у пісочниці

Один catch на весь ланцюжок і пастка fetch зі статусом 404.

fetch('/api/user')
    .then(response => {
        // 404 — це НЕ помилка обіцянки, кидаємо самі
        if (!response.ok) {
            throw new Error('Статус ' + response.status);
        }

        return response.json();
    })
    .then(user => console.log(user.name))
    // ловить помилку з БУДЬ-ЯКОЇ ланки вище
    .catch(error => console.error('Не вдалося:', error.message));

// після catch ланцюжок оживає
Promise.reject(new Error('збій'))
    .catch(() => ({ name: 'Гість' })) // запасні дані
    .then(user => console.log(user.name)); // 'Гість'
автор: NagarD

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Пропозиція правки

Ваша версія — : після перевірки замінить чинну. Нова порада чи нотатка — з'явиться на сторінці після перевірки.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія секції «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія опису «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Зворотний зв'язок
Вхід