nodejs - 在任何更深层次捕获错误

时间:2017-10-05 10:29:46

标签: node.js async-await try-catch

如何捕获async函数内引发的错误。如下面的例子所示:

I)工作示例(错误捕获)

(async () => {
  try {
    // do some await functions

    throw new Error("error1")
  }
  catch(e) {
    console.log(e)
  }
})()

控制台

Error: error1
    at __dirname (/home/test.js:25:11)
    at Object.<anonymous> (/home/quan/nodejs/IoT/test.js:30:3)
    at Module._compile (module.js:624:30)
    at Object.Module._extensions..js (module.js:635:10)
    at Module.load (module.js:545:32)
    at tryModuleLoad (module.js:508:12)
    at Function.Module._load (module.js:500:3)
    at Function.Module.runMain (module.js:665:10)
    at startup (bootstrap_node.js:201:16)
    at bootstrap_node.js:626:3

II)但是,如果我将try-catch放在async之外,则异常将无法捕捉,如下所示:

try {
  (async () => {
    throw new Error("error1")
  })()
}
catch(e) {
  console.log(e)
}

控制台:

(node:3494) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: error1

(node:3494) [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.

有没有办法捕捉async引发的错误,如II中所示?

我必须要求这样做以简化我的代码,其中包含许多switch-case,我不想在每个try-catch中处理switch-case

此致

1 个答案:

答案 0 :(得分:0)

您可以使用promises来解决此问题,在promise链末尾添加catch将有助于捕获异步错误。

function resolveAfter2Seconds(x) {
        return new Promise(resolve => {
            if(x === 'Error'){
                throw Error('My error')
            }

            setTimeout(() => {
            resolve(x);

          }, 2000);
        }).catch(function (e){
            console.log('error-------------------', e)
        });
      }

      async function add1(x) {
        const a = await resolveAfter2Seconds('success');
        const b = await resolveAfter2Seconds('Error');
        return x + a + b;
      }

      add1();