PiCoderman
@PiCoderman

Как сделать обычный throw вместо unhandledRejection в NodeJS?

let go = async () => {
  throw new Error('Some Error');
}
go();

В результате в консоль просто выводится:
(node:14892) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Some Error
(node:14892) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejec
tions that are not handled will terminate the Node.js process with a non-zero exit code.

А как сделать обычный throw?
  • Вопрос задан
  • 1223 просмотра
Пригласить эксперта
Ответы на вопрос 2
eternalSt
@eternalSt
Ответ на Ваш вопрос есть в офф документации
Там же описана причина возникновения события "unhandledRejection".

Вообще есть несколько решений этой задачи, например как это предложили Сергей и Владлен Хеллсайт здесь же в ответа.

Другие варианты:
let go = async () => {
    throw new Error('Some Error');
  }

// можно выловить ошибку в другой async функции
  (async () => {
    try{
      await go()
    }
    catch(error){
      console.error(error); // напечатать лог
      process.exit(1); // вернуть код завершения отличный от нуля
    }
  })()

// Или повесить catch на функцию `go` , это тоже сработает
  go().catch(error => { 
      console.error(error); // напечатать лог
      process.exit(1); // вернуть код завершения отличный от нуля
  })


P.S. Если задать вопрос: "Какой шаблон лучше использовать?". То тут мнения расходятся. Как по мне, так нужно стараться всегда отлавливать ошибки, если это не возможно -- использовать process.on('unhandledRejection')
Ответ написан
Комментировать
@SaXXuM
process.on('unhandledRejection', function (err) {
  console.log('Caught exception: ', err);
});

let go = async () => {
  throw new Error('Inner Error')
}
go();
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы