【问题标题】:Can domains be nested in node.js?域可以嵌套在 node.js 中吗?
【发布时间】:2019-05-25 01:29:15
【问题描述】:

对于同步错误,您可以像这样嵌套错误范围:

try {
  try {
    throw Error('e')
  } catch(e) {
    if(e.message !== 'f')
      throw e
  }
} catch(e) {
  handleError(e)
}

这是我期望它工作的方式,但它没有(似乎域错误处理程序中的错误被抛出到顶部,跳过中间的任何域):

var domain = require('domain');
var dA = domain.create();
dA.on('error', function(err) {
    console.log("dA: "+ err); // never happens
});
dA.run(function() {
    var dB = domain.create();
    dB.on('error', function(err) {
        throw err
    });
    dB.run(function() {
        setTimeout(function() {
            console.log('dB')
            throw 'moo'
        },0)
    });
});

有没有办法做到这一点?

【问题讨论】:

  • 在一个域中运行的代码会创建另一个域这一事实不会使它们嵌套。
  • 值得一提的是,域 API 可能会在节点的未来版本中发生变化。

标签: node.js error-handling node.js-domains


【解决方案1】:

通过重新抛出,冒泡在域中不起作用。如果您想将错误传递给您知道可以处理错误的另一个域,您可以直接在该域上重新发出错误事件:

var domain = require('domain');
var dA = domain.create();
dA.on('error', function(err) {
    console.log("dA: "+ err); // never happens
});
dA.run(function() {
    var dB = domain.create();
    dB.on('error', function(err) {
        dA.emit('error', err);
    });
    dB.run(function() {
        setTimeout(function() {
            console.log('dB')
            throw 'moo'
        },0)
    });
});

稍微扩展一下,从域的错误处理程序中抛出的问题是它直接传播到顶层,更令人困惑的是,如果抛出是错误处理程序中错误的结果,那么堆栈跟踪打印出来的是您的 original 错误,而不是处理程序中的 new 错误。从理论上讲,可以将异常冒泡到堆栈中,但这不是域的设计方式。

如果外部域的处理程序在内部域处于活动状态时抛出异常,“嵌套”域将正常工作,但在这种情况下它所做的是将错误提供给外部域的错误处理程序,然后退出 外部域和嵌套域。这模仿了在 try/catch 情况下 catch 如何展开堆栈,但它可能有点令人困惑。

【讨论】:

  • 这很令人困惑,我认为这是域设计中的一个重大缺陷
猜你喜欢
  • 2011-04-09
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多