33

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

$.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 导致statusTextanderrorThrownundefined

我可以找到XMLHttpRequest.responseText包含构成标准 .net 错误页面的 HTML 的内容。

我在 responseText 中找到页面标题并使用标题来确定引发了哪个错误。虽然我怀疑当我启用自定义错误处理页面时这会崩溃。

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

4

3 回答 3

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()> _
于 2008-08-26T16:32:21.480 回答
16

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

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

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

于 2008-08-26T16:29:46.977 回答
4

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

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

这使我认为irobinson 的方法应该是在这种情况下采用的方法,特别是因为表单只是正在显示的 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 列出的属性之一,因为我的代码中没有它们。

(I am going to accept irobinson's answer, but upvote travis' answer. It just feels strange to be accepting an answer that doesn't have the most votes.)

于 2008-08-27T11:24:16.923 回答