首页 文章

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

提问于
浏览
8

他们已经对这个话题提出了疑问

Node.js Best Practice Exception Handling

这是旧的,答案已经过时了, 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);
    }

}

1 回答

  • 10

    Node.js最佳实践异常处理的答案很古老,而且已经过时了

    没有那么多 . This answer,包含this well-maintained blog post的列表,是最新的 .
    The offical node.js guide总是很好读,而且一般方法没有那么大改变 .

    那变了什么?

    • 域被破坏和弃用 . 嗯,这是个老消息 .

    • 不应再使用典型的"node-style callbacks"及其error-first-parameter,它们只被触发一次 . 这种简单的顺序异步编码风格及其所有问题已被promise和 async / await 取代 . (注意:事件 Launcher 等是不同的情况)

    • process.on('uncaughtException')process.on('unhandledRejection')补充
      如果使用正确,

    • promise也会捕获程序员错误 . 对于无聊的顺序异步代码,它们可以替换域 .

    那么这对于公共代码意味着什么呢?

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

    对,就是这样 . 你应该用 Error (或 async function 来自 async function )拒绝你的承诺 .

    请注意,您很少需要自己调用 reject . 有了承诺,您应该能够在代码中使用 throw . 如果你可能't, you'可能没有正确使用它们 - 程序员的错误也不会被 grab .

    此代码的黄金法则是: Never use callbacks 不是承诺回调 . "Promise callbacks"指的是 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;
        }
    }
    

相关问题