4

同期エラーでは、次のようにエラー スコープをネストできます。

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

これを正しく行う方法はありますか?

4

1 に答える 1

5

バブリングは、再スローによるドメインでは機能しません。エラーを処理できることがわかっている別のドメインにエラーを渡したい場合は、そのドメインでエラー イベントを直接再送信できます。

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

少し拡張すると、ドメインのエラー ハンドラーからのスローの問題は、トップ レベルに直接伝播することです。さらに混乱を招くのは、スローがエラー ハンドラーでのエラーの結果である場合、出力されるスタック トレースがout は、ハンドラーの新しいエラーではなく、元のエラーからのものです。理論的には、例外をスタックにバブルアップすることは可能ですが、それはドメインの設計方法ではありません。

「入れ子になった」ドメインは、内側のドメインがアクティブなときに外側のドメインのハンドラーがスローした場合に適切に機能しますが、その場合、外側のドメインのエラー ハンドラーにエラーを与え、外側のドメインと入れ子になったドメインの両方を終了します。 . これは、try/catch の場合に catch がスタックをアンワインドする方法を模倣していますが、少し混乱する可能性があります。

于 2013-10-28T07:37:59.373 に答える