簡體   English   中英

使用jQuery.ajax()時如何處理錯誤?

[英]How would you handle errors when using jQuery.ajax()?

當使用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導致statusTexterrorThrown 未定義

我可以訪問XMLHttpRequest.responseText ,其中包含構成標准.net錯誤頁面的HTML。

我在responseText中找到頁面標題,並使用標題來確定拋出了哪個錯誤。 雖然我懷疑當我啟用自定義錯誤處理頁面時這會崩潰。

我應該在ashx中拋出錯誤,還是應該返回狀態代碼作為調用userCreation.ashx返回的數據的一部分,然后使用它來決定采取什么操作?
你如何處理這些情況?

對於調試,我通常只在頁面上創建一個元素(在下面的例子中: <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()> _

我應該在ashx中拋出錯誤,還是應該返回狀態代碼作為調用userCreation.ashx返回的數據的一部分,然后使用它來決定采取什么操作? 你如何處理這些情況?

就個人而言,如果可能的話,我寧願在服務器端處理這個問題,並在那里向用戶處理一條消息。 這種情況非常適用於您只想向用戶顯示消息,告訴他們發生了什么(基本上是驗證消息)。

但是,如果要根據服務器上發生的操作執行操作,您可能需要使用狀態代碼並編寫一些javascript以根據該狀態代碼執行各種操作。

現在我對接受哪個答案有疑問。

對這個問題的進一步思考讓我得出結論,我錯誤地拋出異常。 重復的用戶名,電子郵件地址等是注冊過程中的預期問題,因此不是例外,而只是錯誤。 在這種情況下,我可能不應該拋出異常,但返回錯誤代碼。

這讓我覺得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列出的那些屬性之一,因為我的代碼中沒有它們。

(我將接受irobinson的回答,但是請求特拉維斯的回答。接受沒有最多選票的答案感覺很奇怪。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM