使用 jQuery.ajax() 时如何处理错误?
题
使用时 jQuery的 阿贾克斯方法 提交表单数据,处理错误的最佳方法是什么?这是调用的示例:
$.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
, ,然后用它来决定采取什么行动?
你如何处理这些情况?
解决方案
我应该在ASHX中丢弃错误,还是应该返回状态代码作为呼叫返回到UserCreation.ASHX的数据的一部分,然后使用它来决定要采取什么措施?您如何处理这些情况?
就我个人而言,如果可能的话,我更愿意在服务器端处理这个问题,并在那里向用户发送消息。在您只想向用户显示一条消息,告诉他们发生了什么(本质上是验证消息)的情况下,这非常有效。
但是,如果您想根据服务器上发生的情况执行操作,您可能需要使用状态代码并编写一些 JavaScript 来根据该状态代码执行各种操作。
其他提示
为了调试,我通常只创建一个元素(在下面的情况下: <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()> _
现在我有一个问题,不知道该接受哪个答案。
对这个问题的进一步思考使我得出的结论是我错误地抛出了异常。重复的用户名、电子邮件地址等是注册过程中的预期问题,因此不是例外,而只是错误。在这种情况下,我可能不应该抛出异常,而是返回错误代码。
这让我想到 罗宾森的 在这种情况下应该采取这种方法,特别是因为表单只是所显示的 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();
}
然而 特拉维斯的 答案非常详细,在调试期间或者如果我想向用户显示异常消息,这将是完美的。我肯定没有收到 JSON 返回,所以这可能是由于 travis 列出的属性之一,因为我的代码中没有它们。
(我将接受罗宾森的回答,但支持特拉维斯的回答。接受一个没有获得最多票数的答案只是感觉很奇怪。)