2008-08-26 69 views
31

当使用jQueryajax method来提交表单数据时,处理错误的最佳方法是什么? 这是一个什么样的通话可能看起来像一个例子:如何使用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导致statusTexterrorThrownundefined

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

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

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

回答

16

我应该扔在ashx的 的错误,或者我应该返回一个 状态代码由调用返回的 userCreation.ashx数据 的一部分,然后利用这 决定什么行动采取? 如何处理这些情况?

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

但是,如果您想根据服务器上发生的事情执行操作,则可能需要使用状态码并编写一些JavaScript以基于该状态码执行各种操作。在页面上,写XMLHttpRequest来它:

20

为了调试,我通常只需要创建一个元素(<div id="error"></div>在下面的情况下):

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。净错误页面,它包含这样的错误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:非常感谢。 – 2010-08-16 00:29:58

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的答案,但给予好评特拉维斯答案我就觉得奇怪,要接受不具有得票最多的答案。)