2015-02-17 13 views
32

Czy istnieje sposób, aby złapać failed to load resource: net::ERR_CONNECTION_REFUSED, próbowałem:Jak złapać 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); 
} 

fail funkcja mogła złapać, ale nie mam informacji o błędzie, albo jest:

  • ERR_NAME_NOT_RESOLVED
  • ERR_CONNECTION_REFUSED
  • ERR_BLOCKED_BY_CLIENT
  • E RR_TUNNEL_CONNECTION_FAILED (przy użyciu proxy)

lub cokolwiek innego .. pytanie brzmiałoby, jak uzyskać błąd?

+1

Nie otrzymasz konkretnych informacji o błędzie, z zamiarem (ponieważ w przeciwnym razie może dojść do nadużycia w celu uzyskania wglądu w wewnętrzną sieć użytkownika, na przykład). – robertklep

Odpowiedz

11

Próbowałem nawet osiągnąć cel przy użyciu 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); 
 
}

Przede urywek tylko daje ogólną obsługę błędów, a ja nie jestem coraz dokładną przyczynę błędu. Instrukcja try...catch nie przechwytuje niczego, ponieważ żadna z funkcji wewnątrz bloku try nie rzuca żadnych wyjątków. Wygląda na to, że XMLHttpRequest działa w wątku w tle, więc błąd runtime nie jest możliwy do odczytania.

Ponieważ jQuery jest biblioteką, która jest w rzeczywistości javascriptem, zachowa się ona również dla $.post(), ponieważ $.post() używa również XMLHttpRequest za kurtyną.

Poniżej znajduje się wersja jQuery, która będzie obsługiwać ogólny błąd, ponieważ nie możemy dokładnie znać przyczyny błędu.

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>

Wnioski

jako JavaScript XMLHttpRequest() wciąż nie jest wystarczająco wydajny do obsługi różnych stanów błędów, nie możemy znać dokładną przyczynę błędu sieci dla żądań AJAX. Możemy uchwycić jedynie błędów ogólnych i niektóre inne znane kody stanu jak

„404” dla pliku nie znaleziono

„500” na serwer nie odpowiada

Więcej może być znana z https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

+2

Jestem prawie pewien, że stan() nie ma nic wspólnego z siecią, ale z obiektem Odroczony. "Odrzucony" oznacza, że ​​odroczony obiekt został odrzucony zamiast rozstrzygnięty. – Claudio

+0

Ok, rozumiem.Dziękuję za wzmiankę o @Claudio. Czy możesz zasugerować jakikolwiek sposób sprawdzenia odrzucenia przez sieć? –

+0

Nope :( Mam problem również za tym, i niestety nie ma rozwiązania, które mogę myśleć.Może będę badać websocket, aby sprawdzić, czy diagnoza problemu sieciowego może być nieco bardziej interesująca .. – Claudio

3
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(); 

Alternatywnym sposobem na uzyskanie błędów, które mogą być łatwiejsze do zrozumienia w późniejszym czasie, jest obsługa zdarzeń onerror. Z tego, co widziałem, nie dostarczy ci to więcej użytecznych informacji niż rozwiązanie Kiransa.

+0

Dzięki, przynajmniej wykrywa, że ​​wystąpił błąd (w przeciwieństwie do try-catch wokół .send, który nie wydają się łapać). Moją jedyną obawą jest obsługa przeglądarki w tym zakresie. Jeśli nie jest dostępny, jak inaczej wykryłbyś błąd na poziomie sieci oprócz limitu czasu? Może warto sprawdzić, jak $ .ajax wykryje to, zanim nie dotrzyma obietnicy. – Shane

Powiązane problemy