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

标签 javascript node.js async-await ecmascript-next

他们已经是关于这个主题的问题了

Node.js Best Practice Exception Handling

这是旧的,答案非常过时,domains 从那时起甚至被弃用。

现在在后异步/等待 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);
    }

}

最佳答案

The answers from Node.js Best Practice Exception Handling are old and very much outdated

没那么多。 This answer , 列表来自 this well-maintained blog post , 是最新的。
The offical node.js guide总是一本好书,一般方法没有太大改变。

那么发生了什么变化呢?

  • 域已损坏并已弃用。好吧,那是旧闻了。
  • 不应再使用带有错误优先参数的典型“Node 式回调”,它们只触发一次。这种简单的顺序异步编码风格及其所有问题已被 promises 和 async/await 取代。 (注意:事件发射器等是不同的情况)
  • process.on('uncaughtException')process.on('unhandledRejection')补充
  • promises 如果使用得当也会捕获程序员的错误。对于无聊的顺序异步代码,它们可以替代域。

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

Shouldn't we consider sync and async cases similarly and throw exceptions in sync functions and rejecting promises in async functions instead of returning an Error instance?

是的,没错。您应该使用 Error 拒绝您的 promise(或从 async functionthrow)。

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

此代码的黄金法则是:永远不要使用不是 promise 回调的回调。 “Promise 回调”指的是 new Promisethencatch 参数,可能还有你的库的一些自定义方法(例如 最后)。这是上面的示例代码有问题的地方。写对了,应该是

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

关于javascript - Node.js 异常处理最佳实践 - Async/Await 之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39655038/

相关文章:

javascript - Angular 4 数据绑定(bind)概念

javascript - 关于connection.end()在node.js mySQL模块中如何工作的困惑

javascript - Node.js 请求随机开始挂起,直到服务器重启才会清除

c# - 配置等待 : On which thread is the exception handled?

c# - 在异步单元测试中调用 Assert.Inconclusive() 被报告为失败

javascript - 移动到 Azure 仪表板中的特定位置

javascript - Drupal 7 jQuery 脚本的类型错误 : $ is not a function

sql - 使用限制的 Sequelize 分页需要 4 倍的时间来加载。我该如何优化?

node.js - 在不使用 express.js 保存文件的情况下使用文件内容?

javascript - ES2018 Async Generator 的简明部分应用?