Как поймать сеть :: ERR_CONNECTION_REFUSED

30

Есть ли способ поймать failed to load resource: net::ERR_CONNECTION_REFUSED, я пробовал:

try {
  $.post('',{},function(res) {
  }).fail(function (xhr, textStatus, errorThrown) { 
    xhr.textStatus = textStatus;
    xhr.errorThrown = errorThrown;
    console.log('fail',xhr);
    // how to get the 'ERR_CONNECTION_REFUSED' or anything else as string?
  });
} catch(e) {
  console.log('catch',e);
}

Функция сбоя может быть заражена, но я не получил информации об ошибке, либо она:

  • ERR_NAME_NOT_RESOLVED
  • ERR_CONNECTION_REFUSED
  • ERR_BLOCKED_BY_CLIENT
  • ERR_TUNNEL_CONNECTION_FAILED (при использовании прокси)

или что-нибудь еще.. вопрос будет, как получить такую ​​ошибку?

  • 3
    Вы не получите конкретную информацию об ошибке намеренно (потому что в противном случае ее можно использовать, например, для ознакомления с внутренней сетью пользователя).
Теги:
exception

2 ответа

11
Лучший ответ

Я даже пытался достичь цели, используя javascript XMLHttpRequest()

var xhttp= new XMLHttpRequest();
try{
  xhttp.onreadystatechange = function() {
    console.log(xhttp);
    if (xhttp.readyState == 4 && xhttp.status == 0) {
      alert("Unknown Error Occured. Server response not received.");
    }
  };
  xhttp.open("POST", "http://localhost:8080/data", true);
  xhttp.send();
}catch(e){
  console.log('catch', e);
}

Выше фрагмент дает только общую обработку ошибок, в то время как я не получаю точной причины ошибки. Оператор try...catch не может ничего поймать, потому что ни одна из функций внутри блока try не выбрасывает никаких исключений. Кажется, что XMLHttpRequest работает в фоновом потоке, поэтому его ошибка времени выполнения не может быть увлекательной.

Поскольку jQuery - это библиотека, которая на самом деле является javascript, она также будет вести себя одинаково для $.post(), потому что $.post() также использует XMLHttpRequest за занавеской.

Ниже приведена версия jQuery, которая также будет обрабатывать общую ошибку, поскольку мы не можем точно знать причину ошибки.

try {
  $.post('http://localhost:8080/data', {}, function(res) {}).fail(function() {
      alert("Unknown Error Occured. Server response not received.");
  });
} catch (e) {
  console.log('catch', e);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Заключение

Поскольку javascript XMLHttpRequest() по-прежнему недостаточно эффективен для обработки различных состояний ошибок, мы не можем точно знать причину сетевой ошибки для запросов AJAX. Мы можем записывать только общие ошибки и некоторые другие известные коды состояния, такие как

"404" для файла не найден

"500" для сервера не отвечает

Подробнее можно узнать из https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

  • 2
    Я почти уверен, что state () не имеет ничего общего с сетью, а только с отложенным объектом. «Отклонено» означает, что отложенный объект был отклонен, а не разрешен.
  • 0
    Ладно, я понял. Спасибо за упоминание @Claudio. Можете ли вы предложить какой-либо способ проверить отказ по сети?
Показать ещё 4 комментария
1
var xhttp= new XMLHttpRequest();
xhttp.onreadystatechange = function() {
console.log(xhttp);

xhttp.onerror = function(e){
    alert("Unknown Error Occured. Server response not received.");
};

xhttp.open("POST", "http://localhost:8080/data", true);
xhttp.send();

Альтернативным способом получения ошибок, которые могут быть легче понять позже, является обработчик события onerror. Из того, что я видел, он не даст вам более полезной информации, чем решение Киранса.

  • 0
    Спасибо, по крайней мере, он обнаружил, что произошла ошибка (в отличие от try-catch вокруг .send, который, похоже, не ловит). Мое единственное беспокойство - поддержка браузера для этого. Если нет, как еще вы обнаружите ошибку на уровне сети, кроме использования тайм-аутов? Возможно, стоит проверить, как $ .ajax обнаруживает это, прежде чем выполнить обещание.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню