Node.JS - 无法使用try / catch块获得异步抛出

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node.JS - 无法使用try / catch块获得异步抛出相关的知识,希望对你有一定的参考价值。

当我在节点中创建异步函数并使用await时,我正在执行等待promise解析(可能是解决或拒绝),我所做的是在try / catch块中放置await promise并抛出承诺拒绝的错误。问题是,当我在try / catch块中调用此异步函数以捕获错误时,我得到一个UnhandledPromiseRejectionWarning。但是使用await的重点不在于等待解决并返回结果的承诺?看起来我的异步函数正在返回一个promise。

示例 - UnhandledPromiseRejectionWarning的代码:

let test = async () => {
   let promise = new Promise((resolve, reject) => {
      if(true) reject("reject!");
      else resolve("resolve!");
   });
   try{
      let result = await promise;
   }
   catch(error) {
      console.log("promise error =", error);
      throw error;
   }
}

let main = () => {
   try {
      test();
   }
   catch(error){
      console.log("error in main() =", error);
   }
}

console.log("Starting test");
main();
答案

异步函数总是返回promises。事实上,他们总是返回原生承诺(即使你返回蓝鸟或常数)。 async / await的重点是减少.then回调地狱的版本。你的程序仍然必须在main函数中至少有一个.catch来处理任何到达顶部的错误。

顺序异步调用非常好,例如;

async function a() { /* do some network call, return a promise */ }

async function b(aResult) { /* do some network call, return a promise */ }

async function c() {
   const firstRes = (await (a() /* promise */) /* not promise */);
   const secondRes = await b(firstRes/* still not a promise*/);
}

你不能在没有功能的情况下使用await。通常这意味着你的main函数,或init或你称之为的任何东西都不是异步的。这意味着它不能调用await并且必须使用.catch来处理任何错误,否则它们将是未处理的拒绝。在节点版本的某个时刻,这些将开始取出您的节点进程。

想想async回归本土的承诺 - 无论如何 - 和await同时解开承诺“同步”。

  • 注意async函数返回本机promise,它不会同步解析或拒绝: Promise.resolve(2).then(r => console.log(r)); console.log(3); // 3 printed before 2 Promise.reject(new Error('2)).catch(e => console.log(e.message)); console.log(3); // 3 before 2
  • 异步函数将同步错误作为被拒绝的承诺返回。 async function a() { throw new Error('test error'); } // the following are true if a is defined this way too async function a() { return Promise.reject(new Error('test error')); } /* won't work */ try { a() } catch(e) { /* will not run */ } /* will work */ try { await a() } catch (e) { /* will run */ } /* will work */ a().catch(e => /* will run */)
另一答案

Main必须是异步函数才能捕获异步错误

// wont work
let main = () =>{
    try{
        test();
    }catch(error){
        console.log("error in main() =", error);
    }
}

// will work
let main = async () =>{
    try{
        test();
    }catch(error){
        console.log("error in main() =", error);
    }
}

以上是关于Node.JS - 无法使用try / catch块获得异步抛出的主要内容,如果未能解决你的问题,请参考以下文章

这是编写以在javascript / node js中处理错误处理then-catch或try-catch的最佳实践[重复]

如何在Node,js中处理异常控制?

Node.js-入门

错误:TypeError:尝试为网站 node.js 注册用户时无法读取未定义的属性“catch”

无法使用 try-catch 处理 SQL 异常 [重复]

无法使用 try-catch 处理未处理的 Promise Rejection