Как можно обработать ошибку (reject) промиса при использовании await?
Ответ от нейросети
sobes.tech AI
При использовании await с промисом, ошибки (reject) могут быть обработаны несколькими способами:
-
Конструкция
try...catch: Наиболее распространенный и рекомендуемый способ. Позволяет элегантно перехватить ошибку, выброшенную при разрешении (resolve) или отклонении (reject) промиса.async function fetchData() { try { const response = await fetch('https://api.example.com/data'); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); console.log(data); } catch (error) { console.error('Ошибка при получении данных:', error); // Дополнительная обработка ошибки или уведомление пользователя } } fetchData(); -
Метод
.catch()послеawait: Менее предпочтительный, но возможный вариант. Ошибка будет обработана в колбэке.catch(), если промис отклонен.async function fetchData() { const response = await fetch('https://api.example.com/data') .catch(error => { console.error('Ошибка при выполнении fetch:', error); // Обработка ошибки fetch throw error; // Перебрасываем ошибку для дальнейшей обработки, если необходимо }); if (response && !response.ok) { console.error(`HTTP error! status: ${response.status}`); // Обработка HTTP ошибки } if (response && response.ok) { const data = await response.json() .catch(error => { console.error('Ошибка при парсинге JSON:', error); // Обработка ошибки парсинга JSON }); if (data) { console.log(data); } } } fetchData();Этот подход может стать громоздким при обработке множества потенциальных точек отказа.
-
Обработка с возвращаемым значением ошибки: Некоторые библиотеки или собственные функции могут возвращать кортеж
[данные, ошибка]вместо отклонения промиса.async function safelyFetchData() { const [data, error] = await safePromise(fetch('https://api.example.com/data')); if (error) { console.error('Общая ошибка при получении данных:', error); return null; // Или другое значение, указывающее на сбой } // Предполагаем, что safePromise также обрабатывает ошибки response.ok console.log(data); return data; } // Пример реализации safePromise (упрощенный) async function safePromise(promise) { try { const result = await promise; // Тут может быть проверка result.ok для fetch if (result && result.ok !== undefined && !result.ok) { throw new Error(`HTTP error! status: ${result.status}`); } // Для fetch, возможно, нужно будет await result.json() if (result && typeof result.json === 'function') { const jsonData = await result.json(); return [jsonData, null]; } return [result, null]; } catch (error) { return [null, error]; } } safelyFetchData();Этот паттерн (часто называемый "error-first callback" или "go-style error handling") удобен, когда требуется обрабатывать ошибки локально без прерывания выполнения функции.
Наиболее чистым и читабельным способом является использование try...catch вокруг блока кода, содержащего await.