Найдите логическую ошибку в следующем JavaScript/TypeScript async-коде: async function getData(){ try { fetch(url).then(res => res.json()); } catch(e){ console.error(e); } } — почему ошибки из fetch могут не быть пойманы и как переписать правильно

23 Апр в 16:00
19 +1
0
Ответы
1
Проблема: в исходном коде вы запускаете асинхронную операцию `fetch(url).then(...)`, но не `await`-ите её. `try/catch` в async-функции ловит только синхронные ошибки и отклонения тех промисов, которые вы `await`-ите. В вашем случае промис от `fetch` завершится позже, вне `try`-блока, поэтому его отклонение (или отклонение `res.json()`) не попадёт в `catch`. Дополнительно: `fetch` по‑умолчанию не бросает при HTTP‑статусах >=400 — нужно проверять `res.ok` и бросать вручную.
Правильные варианты:
1) С async/await (рекомендуется)
```
async function getData() {
try {
const res = await fetch(url);
if (!res.ok) throw new Error(`HTTP error ${res.status}`);
const data = await res.json();
return data;
} catch (e) {
console.error(e);
throw e; // по необходимости пробросить дальше
}
}
```
2) С промис‑цепочкой
```
function getData() {
return fetch(url)
.then(res => {
if (!res.ok) throw new Error(`HTTP error ${res.status}`);
return res.json();
})
.catch(e => {
console.error(e);
throw e;
});
}
```
Короткая правка вашего кода (если всё же хотите .then внутри try):
```
async function getData() {
try {
await fetch(url).then(res => res.json());
} catch (e) {
console.error(e);
}
}
```
Но лучше полностью использовать `await` для читабельности и корректной обработки ошибок (вариант 1).
23 Апр в 16:06
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир