Функция ошибки jQuery ajax

130

У меня есть вызов ajax, передающий данные на страницу, которая затем возвращает значение.

Я получил успешный вызов со страницы, но закодировал его так, что он вызывает ошибку в asp. Как мне получить эту ошибку из jquery?

Например:

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

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

Дэррил Уилсон
источник
Там опечатка: это dataTypeне так datatype.
Алехандро Нава,
7
@ alej27: формулировка немного странная, но в нем не говорится, что вы не можете использовать их оба, в нем говорится, что запрос не будет вызывать успех или ошибку (потому что они взаимоисключающие).
Марти Вэнс,
Будьте осторожны с ответами здесь Начиная с jQuery 3.0, устаревшие отмечены .errorи .successстановятся более важными, поскольку они были удалены.
Марк Шультайс,

Ответы:

222

Обязательными параметрами в errorфункции Ajax являются, jqXHR, exceptionи вы можете использовать их, как показано ниже:

$.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);
    },
});

ДЕМО FIDDLE


параметры

jqXHR:

На самом деле это объект ошибки, который выглядит так

Ошибка Ajax объект jqXHR

Вы также можете просмотреть это в своей собственной консоли браузера, используя console.logвнутри errorфункции, например:

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

Мы используем status свойство этого объекта, чтобы получить код ошибки, например, если мы получаем статус = 404, это означает, что запрошенная страница не может быть найдена. Его вообще не существует. На основе этого кода состояния мы можем перенаправлять пользователей на страницу входа или на то, что требует наша бизнес-логика.

исключение:

Это строковая переменная, которая показывает тип исключения. Итак, если мы получаем ошибку 404, exceptionтекст будет просто «ошибка». Точно так же мы можем получить «тайм-аут», «прервать» как другие тексты исключений.


Устаревшие Примечание:jqXHR.success() , jqXHR.error()и jqXHR.complete()обратные вызовы являются устаревшим JQuery 1.8. Для того, чтобы подготовить свой код для их последующего удаления, использовать jqXHR.done(), jqXHR.fail()и jqXHR.always()вместо этого.

Итак, если вы используете jQuery 1.8 или выше, нам нужно будет обновить логику функции успеха и ошибки, например: -

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

Надеюсь, поможет!

palaѕн
источник
6
Интересно, что не рекомендуется использовать ajaxSetup. См. Api.jquery.com/jquery.ajaxsetup
SleepyBoBos,
1
@ palañн Я думаю, вы неправильно прочитали уведомление об отказе от поддержки. Если вы заметили, уведомление об устаревании говорит об устаревании методов jqXHR, но использование успеха, ошибки и завершения в приведенном выше примере выполняется в объекте метода $ .ajax. Это не является устаревшим, и вам не нужно менять код. Однако, если кто-то предпочитает объединять методы в цепочку, вы можете использовать этот стиль. Когда я прочитал "устаревание ...", это меня сбило (без всякой причины). :-)
bchr02
Начиная с jQuery 3.0 устаревшие отмечены .errorи .successстановятся более важными, поскольку они были удалены
Марк Шультайс,
99

Попробуй это:

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

Если вы хотите сообщить своему интерфейсу об ошибке проверки, попробуйте вернуть json:

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

Ваш asp-скрипт должен вернуть:

{"error": true}
czerasz
источник
1
Для чего нужны textSttaus и errorThrown? Не могли бы вы объяснить
Аннапурна
4

Вот как вытащить ошибку 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.');
                  }
              }
Богатый C
источник
2
error(jqXHR, textStatus, errorThrown)

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

Правин Прасад
источник
9
Пожалуйста, предоставьте объяснение, а не просто фрагмент кода и ссылку на документы.
Грег Дубицки
12
Спасибо вам почти ни за что.
judasane
например, вы могли бы сказать: «OP использует ошибку функции (ошибку), но jquery вызывает ошибку функции (jqXHR, textStatus, errorThrown). Обратите внимание на 2 отсутствующих параметра во фрагменте 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
источник
2

вы используете функцию

error(error) 

но jquery фактически ищет функцию с тремя параметрами:

error(jqXHR, textStatus, errorThrown)

вам нужно будет добавить еще два параметра.

ТАКЖЕ: ознакомьтесь со всеми комментариями выше, в которых упоминается слово «не рекомендуется» :)

$.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
});
increddibelly
источник
4
вам нужно будет добавить еще два параметра - это неправильно.
Разработчик
1
хмм. если это все, что ты хочешь сказать - может, ничего не скажешь? или вы МОЖЕТЕ объяснить свое утверждение и действительно помочь. Твой выбор.
increddibelly
1
В JavaScript предположим, что у вас есть метод, function myMethod (err) { alert(err); }а затем назовите его так: он myMethod ("something is wrong", 500, some_object)будет работать без проблем. Согласно вашему заявлению, это будет работать, только если подпись метода function myMethod (err, status, some_object). Забудьте о приведенном выше примере, сигнатура successсобытия, которое у вас есть в ответе, есть на самом деле .success(data, status, xhr), но если вам просто нужен результат, мы обычно привязываем его, .success (data)и оба работают.
Разработчик
И какую пользу вы внесли, добавив этот ответ? ИМО, в вашем ответе нет информации, которой не хватало в предыдущих ответах. Единственное, что вы сделали, - это снова подняли этот вопрос в стопку.
Разработчик
0

С 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.

Если вам нужны глобальные обработчики, вы можете использовать:

.ajaxStart(), .ajaxStop(),
.ajaxComplete(), .ajaxError(),
.ajaxSuccess(), .ajaxSend()
Джон Клоян
источник