Funkcja błędu jQuery ajax

134

Mam wywołanie ajax przekazujące dane do strony, która następnie zwraca wartość.

Pobrałem pomyślne wywołanie ze strony, ale zakodowałem je tak, aby powodowało błąd w pliku asp. Jak mogę odzyskać ten błąd z jQuery?

Na przykład:

cache: false,
url: "addInterview_Code.asp",
type: "POST",
datatype: "text",
data: strData,
success: function (html) {
    alert('successful : ' + html);
    $("#result").html("Successful");
},
error: function (error) {
    **alert('error; ' + eval(error));**
}

To błąd, którego nie rozumiem. W funkcji jaki parametr muszę podać, abym mógł następnie skorzystać z komunikatu o błędzie, który podniosłem na serwerze.

Darryl Wilson
źródło
Jest tam literówka: tak dataTypenie jest datatype.
Alejandro Nava
Ponadto jQuery mówi, że nie możesz używać zarówno sukcesu, jak i błędu , tak jak to zrobiłeś.
Alejandro Nava
7
@ alej27: sformułowanie jest trochę dziwne, ale nie mówi, że nie możesz użyć ich obu, mówi, że żądanie nie wywoła sukcesu ani błędu (ponieważ wykluczają się one wzajemnie).
Marty Vance
Zachowaj ostrożność przy udzielaniu odpowiedzi w tym miejscu Począwszy od jQuery 3.0, elementy przestarzałe zostały odnotowane w dniu .errori .successstają się ważniejsze, gdy zostały usunięte.
Mark Schultheiss

Odpowiedzi:

228

Wymagane parametry w errorfunkcji Ajax to jqXHR, exceptioni możesz jej używać jak poniżej:

$.ajax({
    url: 'some_unknown_page.html',
    success: function (response) {
        $('#post').html(response.responseText);
    },
    error: function (jqXHR, exception) {
        var msg = '';
        if (jqXHR.status === 0) {
            msg = 'Not connect.\n Verify Network.';
        } else if (jqXHR.status == 404) {
            msg = 'Requested page not found. [404]';
        } else if (jqXHR.status == 500) {
            msg = 'Internal Server Error [500].';
        } else if (exception === 'parsererror') {
            msg = 'Requested JSON parse failed.';
        } else if (exception === 'timeout') {
            msg = 'Time out error.';
        } else if (exception === 'abort') {
            msg = 'Ajax request aborted.';
        } else {
            msg = 'Uncaught Error.\n' + jqXHR.responseText;
        }
        $('#post').html(msg);
    },
});

DEMO FIDDLE


Parametry

jqXHR:

W rzeczywistości jest to obiekt błędu, który wygląda tak

Błąd Ajax obiekt jqXHR

Możesz również wyświetlić to we własnej konsoli przeglądarki, używając console.logwewnątrz errorfunkcji, takiej jak:

error: function (jqXHR, exception) {
    console.log(jqXHR);
    // Your error handling logic here..
}

Używamy statuswłaściwości tego obiektu, aby uzyskać kod błędu, na przykład jeśli otrzymamy status = 404, oznacza to, że nie można znaleźć żądanej strony. W ogóle nie istnieje. Na podstawie tego kodu statusu możemy przekierowywać użytkowników na stronę logowania lub cokolwiek wymaga naszej logiki biznesowej.

wyjątek:

To jest zmienna łańcuchowa, która pokazuje typ wyjątku. Więc jeśli otrzymujemy błąd 404, exceptiontekst będzie po prostu „błąd”. Podobnie, możemy otrzymać „timeout”, „abort” jako inne teksty wyjątków.


Wycofanie Wskazówka:jqXHR.success() , jqXHR.error(), i jqXHR.complete()wywołania zwrotne są przestarzałe jak jQuery 1.8. Aby przygotować swój kod do ich ostatecznego usunięcia, należy użyć jqXHR.done(), jqXHR.fail()i jqXHR.always()zamiast tego.

Tak więc, jeśli używasz jQuery 1.8 lub nowszego , będziemy musieli zaktualizować logikę funkcji sukcesu i błędu, taką jak: -

// Assign handlers immediately after making the request,
// and remember the jqXHR object for this request
var jqxhr = $.ajax("some_unknown_page.html")
    .done(function (response) {
        // success logic here
        $('#post').html(response.responseText);
    })
    .fail(function (jqXHR, exception) {
        // Our error logic here
        var msg = '';
        if (jqXHR.status === 0) {
            msg = 'Not connect.\n Verify Network.';
        } else if (jqXHR.status == 404) {
            msg = 'Requested page not found. [404]';
        } else if (jqXHR.status == 500) {
            msg = 'Internal Server Error [500].';
        } else if (exception === 'parsererror') {
            msg = 'Requested JSON parse failed.';
        } else if (exception === 'timeout') {
            msg = 'Time out error.';
        } else if (exception === 'abort') {
            msg = 'Ajax request aborted.';
        } else {
            msg = 'Uncaught Error.\n' + jqXHR.responseText;
        }
        $('#post').html(msg);
    })
    .always(function () {
        alert("complete");
    });

Mam nadzieję, że to pomoże!

palaѕн
źródło
6
Co ciekawe, nie zaleca się używania ajaxSetup. Zobacz api.jquery.com/jquery.ajaxsetup
SleepyBoBos
1
@ palaѕн Myślę, że źle odczytałeś zawiadomienie o wycofaniu. Jeśli zauważysz, powiadomienie o wycofaniu mówi o przestarzałym działaniu metod jqXHR, ale użycie sukcesu, błędu i zakończenia w powyższym przykładzie jest wykonywane w obiekcie metody $ .ajax. Nie zostało to wycofane i nie musisz zmieniać swojego kodu. Jeśli jednak ktoś woli łączyć metody w łańcuch, można użyć tego stylu. Kiedy przeczytałem „deprecation ...”, zrzuciło mnie to (bez powodu). :-)
bchr02
Począwszy od jQuery 3.0, przestarzałe odnotowano .errori .successstały się ważniejsze, ponieważ zostały usunięte
Mark Schultheiss
100

Spróbuj tego:

error: function(jqXHR, textStatus, errorThrown) {
  console.log(textStatus, errorThrown);
}

Jeśli chcesz poinformować swój frontend o błędzie walidacji, spróbuj zwrócić json:

dataType: 'json',
success: function(data, textStatus, jqXHR) {
   console.log(data.error);
}

Twój skrypt ASP powinien zwrócić:

{"error": true}
czerasz
źródło
1
Do czego służy textSttaus i errorThrown? Czy możesz wyjaśnić
Annapurna
4

Oto, jak wyciągasz błąd asp.

              cache: false,
              url: "addInterview_Code.asp",
              type: "POST",
              datatype: "text",
              data: strData,
              success: function (html) {
                  alert('successful : ' + html);
                  $("#result").html("Successful");
              },
              error: function (jqXHR, textStatus, errorThrown) {
                  if (jqXHR.status == 500) {
                      alert('Internal error: ' + jqXHR.responseText);
                  } else {
                      alert('Unexpected error.');
                  }
              }
Bogaty C.
źródło
2
error(jqXHR, textStatus, errorThrown)

http://api.jquery.com/jQuery.ajax/

Praveen Prasad
źródło
9
Podaj wyjaśnienie, a nie tylko fragment kodu i link do dokumentów.
Greg Dubicki
12
Dziękuję za prawie nic.
judasane
na przykład mógłbyś powiedzieć „OP używa błędu funkcji (błędu), ale jquery wywołuje błąd funkcji (jqXHR, textStatus, errorThrown). Zwróć uwagę na 2 brakujące parametry we fragmencie OP”.
Increddibelly
2
          cache: false,
          url: "addInterview_Code.asp",
          type: "POST",
          datatype: "text",
          data: strData,
          success: function (html) {
              alert('successful : ' + html);
              $("#result").html("Successful");
          },
          error: function(data, errorThrown)
          {
              alert('request failed :'+errorThrown);
          }
sT0n3
źródło
2

używasz funkcji

error(error) 

ale jquery w rzeczywistości szuka funkcji z trzema parametrami:

error(jqXHR, textStatus, errorThrown)

musisz dodać jeszcze dwa parametry.

TAKŻE: proszę spojrzeć na wszystkie powyższe komentarze, w których jest mowa o „przestarzałym” :)

$.ajax("www.stackoverflow.com/api/whatever", {
    dataType:"JSON"
    data: { id=1, name='example' }
}).succes(function (result) {
    // use result
}).error(function (jqXHR, textStatus, errorThrown) {
    // handle error
});
niewiarygodnie
źródło
4
musisz dodać jeszcze dwa parametry - to jest takie złe.
Deweloper
1
hmm. jeśli to wszystko, co masz do powiedzenia - może nic nie mów? lub MOŻESZ wyjaśnić swoje stwierdzenie i faktycznie pomóc. Twój wybór.
amazingdibelly,
1
W JavaScript powiedz, że masz metodę - function myMethod (err) { alert(err); }a następnie nazwij ją w myMethod ("something is wrong", 500, some_object)ten sposób - To zadziała bez problemu. Zgodnie z Twoim oświadczeniem zadziała to tylko wtedy, gdy podpis metody to function myMethod (err, status, some_object). Zapomnij o powyższym przykładzie, podpis successzdarzenia, które masz w odpowiedzi, jest faktycznie .success(data, status, xhr), ale jeśli potrzebujesz tylko wyniku, zwykle wiążemy go tak, jak .success (data)i oba działają.
Deweloper
A jaką wartość dodałeś dodając tę ​​odpowiedź? IMO W Twojej odpowiedzi nie ma żadnych informacji, których brakowało w poprzednich odpowiedziach. Jedyną rzeczą, jaką zrobiłeś, było ponowne umieszczenie tego pytania w stosie.
Deweloper
0

Z jquery.com:

The jqXHR.success(), jqXHR.error(), and jqXHR.complete()
callback methods introduced injQuery 1.5 are deprecated
as of jQuery 1.8. To prepare your code for their eventual 
removal, use jqXHR.done(), jqXHR.fail(), and jqXHR.always() instead.

Jeśli chcesz globalnych handlerów, możesz użyć:

.ajaxStart(), .ajaxStop(),
.ajaxComplete(), .ajaxError(),
.ajaxSuccess(), .ajaxSend()
John Kloian
źródło