Что выведет код Middle Промисы и async/await обновлено

try/catch и асинхронность

Вопрос

Что выведет код? По строке на каждый вывод.

function f() {
  try {
    setTimeout(() => {
      try { throw new Error('из таймера'); }
      catch (e) { console.log('поймали внутри колбэка'); }
    }, 0);
  } catch (e) {
    console.log('поймали снаружи');
  }
  return 'вернулись';
}
console.log(f());
console.log('дальше');

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: вернулись, дальше, поймали внутри колбэка. Почему так try/catch ловит только синхронные ошибки своего стека.

Что выведет

вернулись
дальше
поймали внутри колбэка

Разбор

Почему так

try/catch ловит только синхронные ошибки своего стека. Колбэк таймера выполняется позже и в другом стеке - его ошибку ловят внутри колбэка либо глобальным обработчиком. Та же причина, по которой нельзя обернуть в try/catch промис без await.

Вывод

вернулись
дальше
поймали внутри колбэка

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме