异步JavaScript中抛出的异常未被捕获。

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

有些人建议使用事件发射器或回调函数(err)来处理这些错误(我不习惯使用带有err、data签名的回调函数)。

如何最好地处理它?

3个回答

13

当你抛出错误时,try {}块已经被远离,因为回调函数是异步在try/catch之外被调用的,所以你无法捕获它。

在错误回调函数内执行任何想要执行的错误情况下的操作。


5
自从node版本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");
});

0
JavaScript 不仅仅具有函数作用域,try-catch 也具有块级作用域。这就是原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接