DirecTwiX
@DirecTwiX
"display: flex;" уже предлагали?

Как поймать исключение в асинхронной функции?

https://codepen.io/DTX/pen/ZXbamj?editors=1011
function do1() {
  throw {error: 'Something went wrong'}
}

async function test() {
  return new Promise(res => {
    setTimeout(() => {
      do1()
      console.log('After throw')
      res()
    }, 2000)
  })
}

async function main() {
  try {
    await test()
  } catch (error) {
    console.log('Error catched: ', error)
  }
  console.log('Finally')
}

main()
  • Вопрос задан
  • 162 просмотра
Решения вопроса 3
SPAHI4
@SPAHI4
реактовцы - это не девы, а прокидыватели пропсов
В данном случае проблема не в async, а в Promise. Ошибка не ловится в .catch, и ее нет. Можно либо ее руками вызвать в .catch, либо, что лучше, вынести setTimeout отдельно.
const delay = ms => new Promise(resolve => setTimeout(() => resolve(), ms));
(async function() {
  try {
    await delay(2000);
    do1();
  } catch (error) {
    console.log('Error catched: ', error)
  } finally {
    console.log('Finally')
  }
})();
Ответ написан
Ni55aN
@Ni55aN
в reject нужно передавать
async function test() {
  return new Promise((res,rej) => {
    setTimeout(() => {
      try {
      do1()
      res()
      }
      catch(e) {
      rej(e);
      }
      console.log('After throw')
    }, 2000)
  })
}
Ответ написан
Комментировать
DirecTwiX
@DirecTwiX Автор вопроса
"display: flex;" уже предлагали?
Как оказалось, в общем случае - никак.
В итоге в ноде использую вот такую конструкцию
process.on('uncaughtException', err => {
    console.error(err)
    process.exit()
})

В браузере, как отметил Никита Полевой, для этой цели подойдёт window.onerror, но я не проверял :)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы