使用jQuery.ajax()时如何处理错误?

时间:2008-08-26 16:26:45

标签: asp.net jquery ajax

使用jQueryajax method提交表单数据时,处理错误的最佳方法是什么? 这是一个调用可能的示例:

$.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会导致statusTexterrorThrown 未定义

我可以访问包含构成标准.net错误页面的HTML的XMLHttpRequest.responseText

我在responseText中找到页面标题,并使用标题来确定抛出了哪个错误。虽然我怀疑当我启用自定义错误处理页面时会出现这种情况。

我应该在ashx中抛出错误,还是应该返回状态代码作为调用userCreation.ashx返回的数据的一部分,然后使用它来决定要采取的操作?
你是如何处理这些情况的?

3 个答案:

答案 0 :(得分: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()> _

答案 1 :(得分:15)

  

我是否应该抛出错误   ashx,或者我应该回来了   状态代码作为数据的一部分   通过电话回来   userCreation.ashx,然后使用它   决定采取什么行动?你怎么   处理这些情况?

就个人而言,如果可能的话,我更愿意在服务器端处理这个问题并在那里向用户发送消息。这种情况非常适用于您只想向用户显示消息,告诉他们发生了什么(基本上是验证消息)。

但是,如果您想根据服务器上发生的事情执行操作,您可能需要使用状态代码并编写一些javascript来根据该状态代码执行各种操作。

答案 2 :(得分:4)

现在我对接受哪个答案有疑问。

关于这个问题的进一步思考让我得出结论,我错误地抛出异常。重复的用户名,电子邮件地址等是注册过程中的预期问题,因此不是例外,而只是错误。在这种情况下,我可能不应该抛出异常,而是返回错误代码。

这使我认为irobinson's方法应该是这种情况下的方法,特别是因为表单只是显示的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();
}

然而,travis'答案非常详细,在调试期间或者我想向用户显示异常消息时是完美的。我肯定没有收到JSON,所以它可能属于travis列出的其中一个属性,因为我的代码中没有它们。

(我将接受irobinson的回答,但是请求特拉维斯的答案。接受没有最多选票的答案感觉很奇怪。)