为什么这个基本的Node.js错误处理不起作用?

时间:2016-01-21 20:02:33

标签: javascript node.js error-handling

Node.js的:

var https = require("https");


var request = https.get("google.com/", function(response) {
    console.log(response.statusCode);
});

request.on("error", function(error) {
        console.log(error.message);
});

如果我将https://添加到Google域名,那么我会按预期获得状态代码200。就像我一样,我希望能够捕获错误,并出现类似于"连接ECONNREFUSED"的错误消息。打印到终端控制台。相反,它将堆栈跟踪打印到终端。

1 个答案:

答案 0 :(得分:11)

如果查看source for https.get(),您可以看到,如果网址解析失败(仅当您通过"google.com/"时才会解析,因为这不是有效的网址),然后它同步抛出:

exports.get = function(options, cb) {
  var req = exports.request(options, cb);
  req.end();
  return req;
};

exports.request = function(options, cb) {
  if (typeof options === 'string') {
    options = url.parse(options);
    if (!options.hostname) {
      throw new Error('Unable to determine the domain name');
    }
  } else {
    options = util._extend({}, options);
  }
  options._defaultAgent = globalAgent;
  return http.request(options, cb);
};

因此,如果您想捕获该特定类型的错误,则需要尝试使用https.get()来尝试/捕获这样的内容:

var https = require("https");

try {
    var request = https.get("google.com/", function(response) {
        console.log(response.statusCode);
    }).on("error", function(error) {
        console.log(error.message);
    });
} catch(e) {
    console.log(e);
}