> Попадем ли в catch при ошибке в асинхронном вызове внутри try в JavaScript (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Kaspersky

Стек: JavaScript

> Пример ответа

Всё зависит от того, как именно организован асинхронный вызов.

Если внутри try находится обычный асинхронный код (например, setTimeout, fetch, Promise без await), то ошибка, возникшая в асинхронной callback-функции или в цепочке промисов, не будет поймана блоком catch. Это происходит потому, что try/catch работает синхронно - он уже завершился к моменту, когда асинхронная операция выполняется.

Пример, когда не попадём:

JAVASCRIPT
try {
setTimeout(() => {
throw new Error('Ошибка');
}, 1000);
} catch (e) {
console.log('Не будет выполнено');
}

Если же использовать async/await с await внутри try, то ошибка от отклонённого промиса будет поймана:

JAVASCRIPT
async function test() {
try {
await fetch('https://несуществующий-url');
} catch (e) {
console.log('Попадём сюда');
}
}

Также можно поймать ошибку, если явно обработать промис через .catch():

JAVASCRIPT
try {
fetch('...').catch(err => console.log('Поймано'));
} catch (e) {
// сюда не попадём, если ошибка возникнет внутри fetch
}

Ключевой вывод: try/catch ловит только синхронные ошибки и ошибки от await внутри async функций. Для асинхронных колбэков или промисов без await нужно использовать .catch() или оборачивать в async/await.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью