[英]How would you handle errors when using jQuery.ajax()?
當使用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導致statusText
和errorThrown
未定義 。
我可以訪問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.