Как правильно отловить исключение? [Начинающий] - PullRequest
1 голос
/ 03 апреля 2019

Существует следующая функция, которая не перехватывает MyException.

const myFunction = () => async (req, res, next) => {
  try {
    myHTTPRequest().then(async (response) => {
      if (response.data.results.length != 1) {
        throw new MyException('MyError');
      }
      res.end('All good');
    })
    .catch((error) => {
      throw error; //Doesn't work
    });
  } catch (error) {
    console.log('This block should catch MyException, but it doesn't');
    next(error);
  }
};

Вместо этого приложение записывает следующее сообщение об ошибке в консоль

(node:45746) UnhandledPromiseRejectionWarning
(node:45746) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)
(node:45746) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Вопрос в том, как настроить код, чтобы перехватить MyException в ожидаемом Catch-Block?

1 Ответ

4 голосов
/ 03 апреля 2019

Проблема в том, что вы смешиваете .then/.catch с try/catch.

Если вы хотите, чтобы код вводил try/catch в функции async, вы должны использовать ключевое слово await в Promise.

Вы можете сбросить .catch, поскольку он ничего не делает, вы снова выдаете ошибку, и это вызывает UnhandledPromiseRejectionWarning

const myFunction = () => (req, res, next) => {
  try {
    const response = await myHTTPRequest();

    if (response.data.results.length != 1) {
      throw new MyException('MyError');
    }
    res.end('All good');

  } catch (error) {
    next(error);
  }
};

Используя .then/catch без async/await код будет:

const myFunction = () => (req, res, next) => {

    myHTTPRequest().then((response) => {
      if (response.data.results.length != 1) {
        throw new MyException('MyError');
      }
      res.end('All good');
    })
    .catch((error) => {
      throw error;
       // It makes no sense to throw again in here
       // But I'm showing you how to handle it if you do
    })
    .catch(error => {
        next(error);
    })
};

Конечно, двойной .catch не имеет смысла, и вы должны удалить его, оставив один:

const myFunction = () => (req, res, next) => {

    myHTTPRequest().then((response) => {
      if (response.data.results.length != 1) {
        throw new MyException('MyError');
      }
      res.end('All good');
    })
    .catch(error => {
        next(error);
    })
};
...