Ревью: проглоченная ошибка
Вопрос
Перед тобой код на ревью. Скажи вслух, что здесь не так - по убыванию важности.
Читай вслух, как на ревью: сначала что делает код, потом что сломано.
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 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
ошибка проглатывается и превращается в 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 ошибок.