Как бы вы обрабатывали ошибки при использовании jQuery.ajax()?
Вопрос
При использовании 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 обратно, так что, вероятно, это связано с одним из тех атрибутов, которые перечислил Трэвис, поскольку у меня их нет в моем коде.
(Я собираюсь принять ответ иробинсона, но проголосовать за ответ Трэвиса.Просто кажется странным принимать ответ, который не набрал большинства голосов.)