2008-08-26 76 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的答案,但給予好評特拉維斯答案我就覺得奇怪,要接受不具有得票最多的答案。)