Ответ вслух Junior Код-ревью спрашивают часто обновлено

Ревью: проглоченная ошибка

Вопрос

Перед тобой код на ревью. Скажи вслух, что здесь не так - по убыванию важности.

Читай вслух, как на ревью: сначала что делает код, потом что сломано.

async function saveOrder(order) {
  try {
    const res = await fetch('/api/orders', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(order),
    });
    return await res.json();
  } catch (e) {
    console.log(e);
    return null;
  }
}

// в компоненте
const result = await saveOrder(order);
setOrderId(result.id);

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Проглоченная ошибка - худший вид обработки. catch превращает любой сбой в null, и падение переезжает в вызывающий код на result.id, где причина уже не видна. Отладка такого начинается с нуля. res.ok не проверяется: ответ 500 - это успешный промис, catch не сработает.

Что должно прозвучать в ответе

  • ошибка проглатывается и превращается в null - вызывающий код падает на result.id

  • нет проверки res.ok: 500 не попадёт в catch

  • console.log вместо отправки в мониторинг

  • пользователь не узнает, что заказ не сохранился

  • повтор отправки может создать второй заказ - нужна идемпотентность

  • catch без разбора типа ошибки: сеть, отмена и ошибка сервера смешаны

Что могут спросить следом

  • Где здесь правильно обрабатывать ошибку - в функции или в компоненте?
  • Как сделать повтор безопасным для платежа?

Разбор

Проглоченная ошибка - худший вид обработки. catch превращает любой сбой в null, и падение переезжает в вызывающий код на result.id, где причина уже не видна. Отладка такого начинается с нуля.

res.ok не проверяется: ответ 500 - это успешный промис, catch не сработает. Дальше res.json() попробует разобрать HTML страницы ошибки и упадёт с сообщением про неожиданный токен - это и увидит разработчик вместо «сервер вернул 500».

Пользователь не узнает. Заказ не сохранён, а интерфейс ведёт себя так, будто всё прошло, - в продукте с деньгами это прямой убыток.

console.log в проде не читает никто: ошибка должна уходить в мониторинг с контекстом.

И при повторе - нужна идемпотентность: повторная отправка не должна создавать второй заказ.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.