Node.js最佳实践异常处理-异步/Await之后

Node.js Best Practice Exception Handling - After Async/Await

本文关键字:异步 Await 之后 异常处理 js 最佳 Node      更新时间:2023-09-26

他们已经是这个主题的一个问题

Node.js最佳实践异常处理

从那时起,domains甚至被弃用。

现在,在后Async/Await Node.js场景中,我们不应该类似地考虑同步和异步情况,在同步函数中抛出异常,并拒绝异步函数中的promise,而不是在前一种情况下返回Error实例吗。

let divideSync = function(x,y) {
    // if error condition?
    if ( y === 0 ) {
        // "throw" the error 
        throw new Error("Can't divide by zero exception")
    }
    else {
        // no error occured, continue on
        return x/y
    }
}

模拟异步划分操作

let divideAsync = function(x, y) {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      // if error condition?
      if (y === 0) {
        // "throw" the error safely by rejecting the promise
        reject (new Error("Can't divide by zero exception"));
      } else {
        // no error occured, continue on
        resolve(x / y)
      }
    }, 1000);
  })
};

因此,同步和异步异常可以以统一的方式处理

let main = async function () {
    try {
        //const resultSync = divideSync(4,0);
        const resultAsync = await divideAsync(4,0);
    }
    catch(ex) {
        console.log(ex.message);
    }
}

Node.js最佳实践异常处理的答案是陈旧过时的

没有那么多。这个答案,加上这篇维护良好的博客文章中的列表,是最新的
官方的node.js指南总是一本不错的读物,而且总体方法没有太大变化。

那么,发生了什么变化呢?

  • 域已损坏并已弃用。好吧,这是老新闻了
  • 典型的"节点式回调"及其错误优先参数只触发一次,不应再使用。这种简单的顺序异步编码风格及其所有问题已被promise和async/await所取代。(注意:事件发射器等是另一种情况(
  • process.on('uncaughtException')process.on('unhandledRejection')补充
  • promise如果使用正确,还会捕获程序员错误。对于枯燥的顺序异步代码,它们可以替换域

那么,这对通用代码意味着什么呢?

我们不应该类似地考虑同步和异步的情况,在同步函数中抛出异常,在异步函数中拒绝promise,而不是返回Error实例吗?

没错。你应该用Error拒绝你的承诺(或者从async function拒绝throw(。

请注意,您很少需要自己致电reject。有了promise,您应该能够在代码中throw。如果你做不到,你很可能没有正确使用它们,程序员的错误也不会被发现。

此代码的黄金法则是:永远不要使用不是promise回调的回调。"Promise回调"指的是new Promisethencatch参数,可能还有库的一些自定义方法(例如finally(。这就是上面的示例代码出现问题的地方。写得正确,应该读

async function divideAsync(x, y) {
    await new Promise(resolve =>
        setTimeout(resolve, 1000) // don't even pass a function expression
    );
    if (y === 0) {
        throw new Error("Can't divide by zero exception");
    } else {
        return x / y;
    }
}