2013-10-28 155 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

這很混亂,我認爲這是域設計中的一個主要缺陷 –