Gernar
JavaScript: асинхронность

Можно ли поймать ошибку Promise

Разбор вопроса «Можно ли поймать ошибку Promise» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.

Вопрос

Можно ли поймать ошибку Promise

Профессия

Frontend Developer

Что хочет услышать интервьюер

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

Ключевые тезисы

  • Ошибки в Promise можно поймать с помощью метода .catch(), который обрабатывает отклоненные промисы.
  • Также можно использовать блок try-catch в сочетании с async/await для обработки ошибок асинхронного кода.
  • Если ошибка не обработана, она может привести к неожиданному поведению приложения или его краху.

Подробный ответ

Ошибки в Promise можно обрабатывать несколькими способами, и это важно для предотвращения неожиданного поведения приложения. Основной метод обработки ошибок в промисах — это использование метода .catch(). Этот метод перехватывает любую ошибку, которая возникает в цепочке промисов до него. Если ошибка не обработана, она может привести к краху приложения или к непредсказуемым последствиям. Например, если промис отклонен и нет .catch(), браузер выведет ошибку в консоль.

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

Также важно понимать, как работает цепочка .then().catch(). Если в любом из .then() возникает ошибка, она передается в ближайший .catch() в цепочке. Это позволяет обрабатывать ошибки на разных этапах выполнения кода. Кроме того, можно использовать несколько .catch() в одной цепочке промисов, чтобы обрабатывать разные типы ошибок отдельно.

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

Практические примеры

Пример 1

Пример с использованием .catch():

fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Ошибка:', error));

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

Пример 2

Пример с использованием async/await и try-catch:

async function fetchData() {
  try {
    const response = await fetch('https://api.example.com/data');
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.error('Ошибка:', error);
  }
}
fetchData();

Этот код делает то же самое, что и предыдущий пример, но использует синтаксис async/await.

Пример 3

Пример обработки ошибок в Promise.all():

Promise.all([
  fetch('https://api.example.com/data1').catch(error => ({ error })),
  fetch('https://api.example.com/data2').catch(error => ({ error }))
]).then(results => {
  results.forEach(result => {
    if (result.error) {
      console.error('Ошибка:', result.error);
    } else {
      console.log(result);
    }
  });
});

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

Частые ошибки

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

Связанные темы

  • Цепочка промисов (Promise chaining)
  • Методы Promise: .then(), .catch(), .finally()
  • Синтаксис async/await
  • Обработка ошибок в асинхронном коде

Follow-up вопросы

Как работает цепочка .then().catch() в Promise?

Уровень: basic

Метод .then() обрабатывает успешное выполнение Promise, а .catch() ловит любые ошибки в цепочке. Если один из .then() вернет отклоненный Promise, управление перейдет к ближайшему .catch().

Что произойдет, если не обработать ошибку в Promise?

Уровень: intermediate

Необработанная ошибка приведет к событию 'unhandledrejection' в браузере или 'unhandledRejection' в Node.js. Это может вызвать неожиданное поведение или падение приложения.

Можно ли использовать несколько .catch() в одной цепочке Promise?

Уровень: intermediate

Да, можно. Каждый .catch() обрабатывает ошибки, возникшие после предыдущего .then(). Это полезно для разной обработки ошибок на разных этапах цепочки.

Как обработать ошибку в Promise.all()?

Уровень: advanced

Promise.all() отклоняется при первой ошибке в любом из переданных Promise. Чтобы обработать все ошибки, можно использовать Promise.allSettled(), который возвращает результаты всех Promise, включая отклоненные.

Чем отличается обработка ошибок в async/await от .catch()?

Уровень: intermediate

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

Содержание