Как лучше всего обрабатывать ошибки при использовании метод ajaxjQuery для отправки данных формы? Это пример того, как может выглядеть звонок:
$.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, а затем использовать его, чтобы решить, какое действие предпринять?
Как вы справляетесь с такими ситуациями?





Should I be throwing the errors in the ashx, or should I be returning a status code as part of the data returned by the call to userCreation.ashx, then using this to decide what action to take? How do you handle these situations?
Лично я, если возможно, предпочел бы обрабатывать это на стороне сервера и обрабатывать сообщение для пользователя там. Это очень хорошо работает в сценарии, когда вы хотите только вывести пользователю сообщение о том, что произошло (по сути, сообщение проверки).
Однако, если вы хотите выполнить действие на основе того, что произошло на сервере, вы можете использовать код состояния и написать некоторый 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()> _
@Ismail Я думаю, вам следует задать это в новом вопросе и предоставить часть своего кода.
Теперь у меня проблема с тем, какой ответ принять.
Дальнейшее размышление над проблемой привело меня к выводу, что я неправильно выбрасывал исключения. Повторяющиеся имена пользователей, адреса электронной почты и т. д. Являются ожидаемыми проблемами во время процесса регистрации и поэтому не являются исключением, а просто ошибками. В этом случае я, вероятно, не должен выбрасывать исключения, а возвращать коды ошибок.
Это наводит меня на мысль, что в этом случае следует использовать подход Иробинсона, тем более что форма - это лишь небольшая часть отображаемого пользовательского интерфейса. Я реализовал это решение и возвращаю 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 обратно, так что, вероятно, это связано с одним из тех атрибутов, которые перечислил Трэвис, поскольку у меня их нет в моем коде.
(Я собираюсь принять ответ Иробинсона, но поддержать ответ Трэвиса. Просто странно принимать ответ, который не набрал наибольшее количество голосов.)
Зависит от. Одна из моих первых задач в моей самой первой работе по разработке заключалась в том, чтобы исправить ошибку в системе POS, из-за которой люди, которые платили чеком, взимали плату не только за свой собственный счет, но и за счета других, которые приходили после них. Проблема заключалась в том, что api последовал вашему предложению, но разработчик не прочитал документы и реализовал его неправильно. Если бы это вызвало ошибку, то самой большой проблемой было бы то, что некоторые клиенты не смогли бы платить чеком, пока ошибка не была исправлена. Но вместо этого продуктовому магазину пришлось раздать ряд заказов бесплатно.