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

adn*_*ili 8 javascript node.js async-await ecmascript-next

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

模拟异步除法运算

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);
  })

};
Run Code Online (Sandbox Code Playgroud)

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

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

}
Run Code Online (Sandbox Code Playgroud)

Ber*_*rgi 10

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

没有那么多.这个维护良好的博客文章列表中的答案是最新的.
官方node.js指南始终是一个很好的阅读,一般的方法并没有改变那么多.

那变了什么?

  • 域被破坏和弃用.嗯,这是个老消息.
  • 应该不再使用具有error-first-parameter的典型"节点式回调",它们只被触发一次.这种简单的顺序异步编码风格及其所有问题已被promise和async/ 取代await.(注意:事件发射器等是不同的情况)
  • process.on('uncaughtException') 补充 process.on('unhandledRejection')
  • 如果使用正确, promises也会捕获程序员错误.对于无聊的顺序异步代码,它们可以替换域.

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

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

对,就是这样.你应该用Errors(或者throw来自async functions)拒绝你的承诺.

请注意,您很少会打电话给reject自己.有了承诺,您应该能够使用throw您的代码.如果你不能,你可能没有正确使用它们 - 程序员的错误也不会被抓住.

此代码的黄金法则是:永远不要使用非承诺回调的回调."无极回调"是指new Promise,thencatch论据,并可能你的一些库(例如自定义的方法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;
    }
}
Run Code Online (Sandbox Code Playgroud)