如何以正确的方式捕获异常? [初学者]

问题描述 投票:1回答:1

有以下函数,它不捕获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.

问题是,如何调整代码以在预期的Catch-Block中捕获MyException?

javascript node.js express exception try-catch
1个回答
4
投票

问题在于你将.then/.catchtry/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/catchasync/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);
    })
};
© www.soinside.com 2019 - 2024. All rights reserved.