Сведения о вопросе

Drake

11:42, 2nd August, 2020

Теги

asp.net   jquery   ajax    

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

Просмотров: 393   Ответов: 3

При использовании 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();
        }
});

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

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

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

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

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



  Сведения об ответе

piter

21:17, 14th August, 2020

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

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

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


  Сведения об ответе

PIRLO

12:49, 16th August, 2020

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

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

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


  Сведения об ответе

PROGA

14:34, 29th August, 2020

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

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться