Обработка ошибок запросов

Библиотека Vex предоставляет средства для работы с запросами и обработки ошибок в асинхронных операциях. Ошибки запросов могут возникать по множеству причин, включая неправильные URL, ошибки сети, проблемы с сервером или некорректные ответы. Важно правильно обработать такие ошибки, чтобы пользователь мог понять, что произошло, а приложение не сбивалось с работы. В этой части рассматриваются методы обработки ошибок, доступные в Vex, а также подходы для их правильной реализации в реальных приложениях.

Структура ошибок в Vex

Ошибки в библиотеке Vex передаются через стандартные механизмы обработки исключений JavaScript. Когда запрос не удается выполнить, генерируется объект ошибки, который содержит несколько ключевых свойств:

  • message — описание ошибки, например, “Network Error” или “Request Timeout”.
  • code — код ошибки, если он имеется. Например, для ошибки сетевого соединения это может быть ECONNREFUSED.
  • response — объект ответа, если ошибка произошла после получения ответа от сервера. Это может быть полезно для получения статуса HTTP и данных ошибки, отправленных сервером.

В случае ошибки запрос может быть прерван на разных стадиях: перед отправкой (например, при неправильном формате URL), во время выполнения запроса или после получения ответа от сервера.

Обработка ошибок с использованием Promise

Vex использует Promise для выполнения асинхронных запросов, что позволяет легко обрабатывать ошибки с помощью методов .then() и .catch(). Важно помнить, что .then() используется для обработки успешных ответов, а .catch() для обработки ошибок.

vex.ajax('/api/data')
  .then(response => {
    console.log('Ответ получен:', response);
  })
  .catch(error => {
    console.error('Ошибка запроса:', error.message);
  });

Если запрос успешен, блок .then() выполняется с объектом ответа. Если возникает ошибка, она перехватывается блоком .catch(). Здесь можно обработать как сетевые ошибки, так и ошибки, связанные с некорректными данными, полученными от сервера.

Обработка ошибок с использованием async/await

Метод async/await позволяет писать асинхронный код в более синхронном стиле. Это улучшает читаемость и уменьшает количество вложенных колбэков. Для обработки ошибок в async/await используется блок try/catch, который перехватывает исключения, возникшие как в самом запросе, так и в процессе обработки ответа.

async function fetchData() {
  try {
    const response = await vex.ajax('/api/data');
    console.log('Ответ получен:', response);
  } catch (error) {
    console.error('Ошибка запроса:', error.message);
  }
}

В этом примере запрос выполняется внутри блока try, и если возникает ошибка, она перехватывается и обрабатывается в блоке catch.

Обработка ошибок при статусах HTTP

Важно не только обрабатывать сетевые ошибки, но и правильно реагировать на статусы HTTP, возвращаемые сервером. Например, статус 404 означает, что запрашиваемый ресурс не найден, а статус 500 указывает на внутреннюю ошибку сервера. Библиотека Vex предоставляет механизм для работы с такими статусами.

Можно проверять статус ответа в блоке обработки данных:

vex.ajax('/api/data')
  .then(response => {
    if (response.status === 404) {
      throw new Error('Ресурс не найден');
    } else if (response.status >= 500) {
      throw new Error('Ошибка на сервере');
    }
    console.log('Ответ получен:', response);
  })
  .catch(error => {
    console.error('Ошибка запроса:', error.message);
  });

Если статус ответа указывает на ошибку, можно выбросить исключение с соответствующим сообщением. Это позволит централизованно обрабатывать такие ошибки и уведомлять пользователя о проблемах с сервером.

Перехват и обработка сетевых ошибок

Сетевые ошибки, такие как потеря соединения или тайм-аут, могут возникать в любой момент во время выполнения запроса. Эти ошибки генерируются самим браузером и передаются через объект ошибки в обработчик .catch().

Пример обработки сетевых ошибок:

vex.ajax('/api/data')
  .then(response => {
    console.log('Ответ получен:', response);
  })
  .catch(error => {
    if (error.code === 'ECONNREFUSED') {
      console.error('Ошибка соединения: сервер не доступен');
    } else if (error.message === 'Timeout') {
      console.error('Ошибка запроса: превышено время ожидания');
    } else {
      console.error('Неизвестная ошибка:', error.message);
    }
  });

Здесь важно использовать свойство code для проверки типа ошибки. Это поможет отличить ошибки соединения от ошибок тайм-аута или других непредвиденных ситуаций.

Тайм-ауты запросов

Для того чтобы избежать вечных ожиданий при отсутствии ответа от сервера, Vex предоставляет возможность задать максимальное время ожидания для запроса. Если запрос не успевает завершиться в указанное время, генерируется ошибка тайм-аута.

Пример настройки тайм-аута:

vex.ajax('/api/data', { timeout: 5000 })  // Тайм-аут 5 секунд
  .then(response => {
    console.log('Ответ получен:', response);
  })
  .catch(error => {
    if (error.message === 'Timeout') {
      console.error('Ошибка запроса: превышено время ожидания');
    } else {
      console.error('Ошибка запроса:', error.message);
    }
  });

В данном примере, если запрос не завершится за 5 секунд, возникнет ошибка с сообщением “Timeout”.

Логирование ошибок

Для упрощения диагностики и отслеживания ошибок в реальном времени важно вести логирование ошибок, происходящих в приложении. Vex не предоставляет встроенной поддержки логирования, но с использованием блоков catch можно легко интегрировать сторонние сервисы для отслеживания ошибок.

Пример использования стороннего логирующего сервиса:

vex.ajax('/api/data')
  .then(response => {
    console.log('Ответ получен:', response);
  })
  .catch(error => {
    logErrorToService(error);  // Вызов сторонней функции для логирования ошибок
    console.error('Ошибка запроса:', error.message);
  });

В данном случае, помимо вывода ошибки в консоль, она также будет передана на сервер для дальнейшего анализа и устранения.

Заключение

Правильная обработка ошибок — ключевой момент при работе с асинхронными запросами. Используя возможности библиотеки Vex, можно эффективно отслеживать ошибки, связанные с сетью, сервером или самим запросом. Применение стратегий обработки ошибок, таких как использование Promise с методами .catch(), async/await с блоком try/catch и проверка HTTP-статусов, позволяет создать устойчивое и понятное приложение, которое корректно реагирует на все возможные исключительные ситуации.