Как бы вы обрабатывали ошибки при использовании jQuery.ajax()?

StackOverflow https://stackoverflow.com/questions/28529

  •  09-06-2019
  •  | 
  •  

Вопрос

При использовании jQuery's метод ajax каков наилучший способ обработки ошибок при отправке данных формы?Это пример того, как может выглядеть вызов:

$.ajax({
    url: "userCreation.ashx",
    data: { u:userName, p:password, e:email },
    type: "POST",
    beforeSend: function(){disableSubmitButton();},
    complete: function(){enableSubmitButton();},
    error: function(xhr, statusText, errorThrown){
            // Work out what the error was and display the appropriate message
        },
    success: function(data){
            displayUserCreatedMessage();
            refreshUserList();
        }
});

Запрос может завершиться неудачей по ряду причин, таких как дублирование имени пользователя, дублирование адреса электронной почты и т.д., и ashx написан так, чтобы генерировать исключение, когда это происходит.

Моя проблема, похоже, заключается в том, что, генерируя исключение, ashx вызывает statusText и errorThrown быть неопределенный.

Я могу добраться до XMLHttpRequest.responseText который содержит HTML, составляющий стандартную страницу ошибки .net.

Я нахожу заголовок страницы в responseText и использую заголовок, чтобы определить, какая ошибка была выдана.Хотя у меня есть подозрение, что это развалится, когда я включу пользовательские страницы обработки ошибок.

Должен ли я выдавать ошибки в ashx, или я должен возвращать код состояния как часть данных, возвращаемых вызовом userCreation.ashx, а затем использовать это, чтобы решить, какие действия предпринять?
Как вы справляетесь с подобными ситуациями?

Это было полезно?

Решение

Должен ли я выдавать ошибки в ashx, или я должен возвращать код состояния как часть данных , возвращаемых вызовом userCreation.ashx, затем используя это для решите, какие действия предпринять? Как вы справляетесь с подобными ситуациями?

Лично я, если возможно, предпочел бы обработать это на стороне сервера и отправить сообщение пользователю там.Это очень хорошо работает в сценарии, когда вы хотите только отобразить пользователю сообщение, сообщающее ему, что произошло (по сути, сообщение о проверке).

Однако, если вы хотите выполнить действие, основанное на том, что произошло на сервере, вы можете захотеть использовать код состояния и написать некоторый javascript для выполнения различных действий, основанных на этом коде состояния.

Другие советы

Для отладки я обычно просто создаю элемент (в приведенном ниже примере: <div id="error"></div>) на странице и напишите к ней XMLHttpRequest:

error: function (XMLHttpRequest, textStatus, errorThrown) {
    $("#error").html(XMLHttpRequest.status + "\n<hr />" + XMLHttpRequest.responseText);
}

Затем вы сможете увидеть типы возникающих ошибок и правильно их зафиксировать:

if (XMLHttpRequest.status === 404) // display some page not found error
if (XMLHttpRequest.status === 500) // display some server error

В вашем ashx вы можете создать новое исключение (например, "Недопустимый пользователь" и т.д.), А затем просто проанализировать это из XMLHttpRequest.responseText?Для меня, когда я получаю сообщение об ошибке, XMLHttpRequest.responseText это не стандартная страница с ошибкой Asp.Net, это объект JSON, содержащий ошибку, подобную этой:

{
"Message":"Index was out of range. Must be non-negative and less than the size of the collection.\r\n
Parameter name: index",
"StackTrace":" at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)\r\n 
at etc...",
"ExceptionType":"System.ArgumentOutOfRangeException"
}

Редактировать:Это может быть связано с тем, что функция, которую я вызываю, помечена этими атрибутами:

<WebMethod()> _
<ScriptMethod()> _

Теперь у меня возникла проблема с тем, какой ответ принять.

Дальнейшие размышления над проблемой приводят меня к выводу, что я неправильно выбрасывал исключения.Повторяющиеся имена пользователей, адреса электронной почты и т.д. Являются ожидаемыми проблемами в процессе регистрации и, следовательно, не исключениями, а просто ошибками.В этом случае я, вероятно, должен не создавать исключения, а возвращать коды ошибок.

Это наводит меня на мысль, что айробинсона в этом случае следует использовать именно такой подход, тем более что форма - это лишь небольшая часть отображаемого пользовательского интерфейса.Теперь я реализовал это решение и возвращаю xml, содержащий статус и необязательное сообщение, которое должно быть отображено.Затем я могу использовать jQuery, чтобы разобрать его и предпринять соответствующие действия:-

success: function(data){
    var created = $("result", data).attr("success");
    if (created == "OK"){
        resetNewUserForm();
        listUsers('');
    } else {
        var errorMessage = $("result", data).attr("message");
        $("#newUserErrorMessage").text(errorMessage).show();
    }
    enableNewUserForm();
}

Однако трэвис' ответ очень подробный и был бы идеальным во время отладки или если бы я хотел отобразить пользователю сообщение об исключении.Я определенно не получаю JSON обратно, так что, вероятно, это связано с одним из тех атрибутов, которые перечислил Трэвис, поскольку у меня их нет в моем коде.

(Я собираюсь принять ответ иробинсона, но проголосовать за ответ Трэвиса.Просто кажется странным принимать ответ, который не набрал большинства голосов.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top