10

基本的に、なぜこの例外がキャッチされないのですか?

var http = require('http'),
    options = {
      host: 'www.crash-boom-bang-please.com',
      port: 80,
      method: 'GET'
    };

try {
  var req = http.request(options, function(res) {
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
      console.log('BODY: ' + chunk);
    });
  });

  req.on('error', function(e) {
    throw new Error("Oh noes");
  });
  req.end();
} catch(_error) {
  console.log("Caught the error");
}

一部の人々は、これらのエラーをイベント エミッターまたは callback(err) で処理する必要があることを示唆しています (err を使用したコールバック、データ署名は私が慣れているものではありません)。

それについて行く最善の方法は何ですか?

4

3 に答える 3

13

エラーをスローしているときにtry {}、コールバックが try/catch の外部で非同期に呼び出されるため、ブロックが長く残っています。だから捕まえられない。

エラーコールバック関数内でエラーが発生した場合にやりたいことは何でもします。

于 2012-05-30T19:53:04.843 に答える
5

ノード バージョン 0.8 以降、例外をドメインに制限できます。例外を特定のドメインに制限し、そのスコープでキャッチできます

興味があれば、非同期例外をキャッチする小さな関数をここに書きました: Javascript Asynchronous Exception Handling with node.js。フィードバックをお待ちしております。これにより、次のことが可能になります。

var http = require('http'),
    options = {
      host: 'www.crash-boom-bang-please.com',
      port: 80,
      method: 'GET'
    };

atry(function(){
  var req = http.request(options, function(res) {
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
      console.log('BODY: ' + chunk);
    });
  });

  req.on('error', function(e) {
    throw new Error("Oh noes");
  });
  req.end();
}).catch(function(_error) {
  console.log("Caught the error");
});
于 2013-01-31T22:21:12.217 に答える