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

30

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

Моя проблема заключается в том, что, бросая исключение, ashx заставляет statusText и errorThrown быть undefined.

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

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

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

Теги:

3 ответа

16
Лучший ответ

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

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

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

  • 0
    Зависит. Одной из моих первых задач в моей самой первой работе по разработке было исправление ошибки в системе POS, из-за которой люди, которые оплачивали чеки, получали оплату не только за свой счет, но и за счета других, которые приходили за ними. Проблема заключалась в том, что API следовал вашему предложению, но разработчик не прочитал документы и неправильно их реализовал. Если бы он выдал ошибку, то самой большой проблемой было бы то, что некоторые клиенты не смогли бы оплатить чеком, пока ошибка не будет исправлена. Но вместо этого продуктовый магазин в конечном счете должен был отдать много заказов бесплатно.
20

Для отладки я обычно просто создаю элемент (в следующем примере: <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()> _
  • 0
    +1: большое спасибо.
  • 0
    @Ismail Я думаю, вам следует задать этот вопрос в новом вопросе и предоставить часть своего кода.
4

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

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

Что заставляет меня думать, что подход 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 назад, так что, вероятно, это относится к одному из тех атрибутов, которые перечислены travis, поскольку у меня их нет в моем коде.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню