Почему этот базовый узел.обработка ошибок js не работает?

узел.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, как ожидалось. Как есть, я ожидаю, что ошибка будет поймана и сообщение об ошибке, подобное "connect ECONNREFUSED", будет напечатано на консоли терминала. Вместо этого он печатает stacktrace к терминалу.

1 ответов


если вы посмотрите на источник https.get(), вы можете видеть, что если синтаксический анализ URL не удается (что он будет, когда вы только передадите его "google.com/" так как это недопустимый URL), то он бросает синхронно:

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