【问题标题】:How to catch the exception in the right way? [beginner]如何以正确的方式捕获异常? [初学者]
【发布时间】:2019-08-25 06:38:32
【问题描述】:

有以下函数,它没有捕获 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】:

    问题是您将.then/.catchtry/catch 混合在一起。

    如果您希望代码在async 函数中输入try/catch,则必须在Promise 上使用await 关键字。

    你可以删除.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);
        })
    };
    

    【讨论】:

    • 很好的回复。您应该更改console.log 消息以表示新情况。否则 TLDR;读者可能会错过您的观点。
    猜你喜欢
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多