Как бы вы обрабатывали ошибки при использовании jQuery.ajax ()? - PullRequest
33 голосов
/ 26 августа 2008

При использовании jQuery 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 записывается для выдачи исключения, когда это происходит.

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

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

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

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

Ответы [ 3 ]

20 голосов
/ 26 августа 2008

Для отладки я обычно просто создаю элемент (в случае ниже: <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

Можете ли вы выбросить новое исключение (например, «Неверный пользователь» и т. Д.) В вашем ашхе, а затем просто разобрать его из 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()> _
15 голосов
/ 26 августа 2008

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

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

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

4 голосов
/ 27 августа 2008

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

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

Что заставляет меня думать, что подход irobinson должен быть тем, который следует использовать в этом случае, тем более что форма является лишь небольшой частью отображаемого пользовательского интерфейса. Теперь я реализовал это решение и возвращаю 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();
}

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

(Я собираюсь принять ответ Иробинсона, но ответ «upvote travis». Просто странно принимать ответ, у которого нет большинства голосов.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...