Этот вопрос проверяет понимание асинхронной природы JavaScript и того, как механизм try/catch взаимодействует с циклом событий.
Конструкция try/catch в JavaScript предназначена для синхронной обработки ошибок. Она работает в рамках текущего синхронного потока выполнения, захватывая исключения, которые возникают непосредственно внутри блока try в тот же самый "тик" цикла событий.
Функция setTimeout является асинхронной. Она не выполняет переданный колбэк немедленно, а планирует его выполнение на будущее. После истечения указанной задержки колбэк помещается в очередь задач (task queue). Цикл событий (event loop) заберёт его оттуда и выполнит только тогда, когда основной стек вызовов (call stack) будет пуст. Это происходит уже после того, как весь синхронный код, включая блок try/catch, завершил свою работу.
Рассмотрим пример:
try {
setTimeout(() => {
throw new Error('Ошибка внутри таймаута!');
}, 1000);
} catch (error) {
// Этот блок НЕ выполнится
console.log('Ошибка поймана:', error);
}
Здесь setTimeout вызывается синхронно и завершается успешно (он просто планирует задачу). Сам колбэк с throw выполнится асинхронно, через секунду, в совершенно новом контексте выполнения. К этому моменту управление уже давно вышло из блока try, поэтому поймать эту ошибку стандартным catch невозможно.
try/catch внутрь асинхронной функции:setTimeout(() => {
try {
throw new Error('Теперь поймается!');
} catch (error) {
console.log('Ошибка поймана внутри:', error.message);
}
}, 1000);
.catch():new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error('Ошибка в промисе'));
}, 1000);
}).catch(error => {
console.log('Поймано через catch промиса:', error.message);
});
window.onerror (в браузере) или process.on('uncaughtException') (в Node.js).Вывод: Используйте try/catch только для синхронного кода. Для обработки ошибок в асинхронных операциях (таймауты, промисы, события) применяйте соответствующие асинхронные механизмы — обработчики .catch() у промисов или оборачивайте опасный код в try/catch непосредственно внутри асинхронного колбэка.