【问题标题】:How would you handle errors when using jQuery.ajax()?使用 jQuery.ajax() 时如何处理错误?
【发布时间】:2010-09-06 21:51:46
【问题描述】:

当使用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 未定义

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

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

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

【问题讨论】:

    标签: asp.net jquery ajax


    【解决方案1】:

    为了调试,我通常只是在页面上创建一个元素(在下面的例子中:<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()> _
    

    【讨论】:

    • @Ismail 我认为你应该在一个新问题中提出这个问题并提供一些代码。
    【解决方案2】:

    我应该在 ashx,或者我应该返回一个 状态码作为数据的一部分 调用返回 userCreation.ashx,然后使用它来 决定采取什么行动?你怎么 处理这些情况?

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

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

    【讨论】:

    • 视情况而定。在我的第一份开发工作中,我的首要任务之一是修复 POS 系统中的一个错误,该错误导致通过支票付款的人不仅要为自己的账单付费,而且还要为追随他们的其他人的账单付费。问题是api遵循了你的建议,但是开发人员没有阅读文档并错误地实现了它。如果它引发错误,那么最大的问题将是一些客户在修复错误之前无法通过支票付款。但相反,杂货店最终不得不免费提供一些订单。
    【解决方案3】:

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

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

    这让我认为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 的回答,但要支持 travis 的回答。接受一个没有最多票数的回答感觉很奇怪。)

    【讨论】:

      猜你喜欢
      • 2011-12-02
      • 2013-06-13
      • 2016-12-24
      • 2016-02-18
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      • 2022-12-23
      相关资源
      最近更新 更多