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