Почему последний блок блока try..catch..finally запускается перед catch? - PullRequest
0 голосов
/ 17 января 2020
try {
  throw new Error('yikes!');
} catch (e) {
  throw e;
} finally {
  console.log('caught error!')
}

Распечатывает:

caught error!
Error: yikes!

Так что блок finally работает до оператора throw?

Он только выглядит как будто блок finally запускается первым, но мы можем видеть, что на самом деле это не так:

let failed;

try {
  throw new Error('yikes!');
  failed = false;
} catch (e) {
  failed = true;
  throw e;
} finally {
  console.log(`caught error! failed: ${failed}`)
}

печатает

caught error! failed: true
Error: yikes!

Так почему же выводится ошибка из группа? есть ли здесь какое-то асинхронное поведение, которого я не вижу?

Ответы [ 3 ]

2 голосов
/ 17 января 2020
  1. Попытки запуска - Ваша попытка запускается и выдает ошибку

  2. Поймать запускается - Ваш перехват ловит ошибку и просто повторно выдает ее.

  3. Наконец-то запускается - Вы распечатываете свою строку

  4. Повторная ошибка теперь не найдена - И ваш браузер регистрирует сведения об ошибке

1 голос
/ 17 января 2020

Предложение finally выполняется до завершения общего блока try. Записанная ошибка возникает, когда среда выполнения перехватывает исключение, которое составляет после завершения блока try. (Обратите внимание, что ваш код catch ничего не делает console.log(). Он генерирует новое исключение, но предложение finally будет выполняться до того, как остальной мир увидит это.)

Все языки с try catch finally что я знаю, ведут себя точно так же. Смысл блоков finally состоит в том, чтобы предоставить место для кода, который гарантированно будет работать независимо от того, успешно ли try или нет.

0 голосов
/ 17 января 2020

Оператор throw ничего не печатает. Ошибка выводится позже, когда браузер ловит выданную ошибку.

...