2013-10-28 68 views
3

使用同步的错误,你可以窝误差范围是这样的:域可以嵌套在node.js中吗?

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

有没有办法做到这一点的权利?

+1

在一个域中运行的代码创建另一个域的事实不会使它们嵌套。 –

+0

值得一提的是,域API将在未来版本的节点中发生变化。 –

回答

4

Bubbling不能在域中重新投掷。如果你想传递一个错误到你这儿知道能处理错误另一个域,您可以重新发出对域直接错误事件:

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

若要从一个域的投掷扩大了一点,问题错误处理程序是它直接传播到顶层,而且更容易混淆的是,如果throw是错误处理中的错误的结果,那么打印输出的堆栈跟踪来自您的原始错误,而不是处理程序中出现新的错误。从理论上讲,可能会将例外情况向上叠加,但这不是域名设计的方式。

的“嵌套”域名将正常工作,如果外域的处理程序抛出,而内域是活动的,但它的作用在这种情况下是给错误外域的错误处理程序,然后退出外部和嵌套域。这模仿了catch在try/catch情况下展开堆栈的方式,但它可能有点混乱。

+3

这很混乱,我认为这是域设计中的一个主要缺陷 –