Sobes.tech
Junior
90
questionbank

Как можно обработать ошибку (reject) промиса при использовании await?

Ответ от нейросети

sobes.tech AI

При использовании await с промисом, ошибки (reject) могут быть обработаны несколькими способами:

  1. Конструкция 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();
    
  2. Метод .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();
    

    Этот подход может стать громоздким при обработке множества потенциальных точек отказа.

  3. Обработка с возвращаемым значением ошибки: Некоторые библиотеки или собственные функции могут возвращать кортеж [данные, ошибка] вместо отклонения промиса.

    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.