ajaxcall 中的错误处理
Posted
技术标签:
【中文标题】ajaxcall 中的错误处理【英文标题】:error handling in an ajaxcall 【发布时间】:2011-01-26 06:36:34 【问题描述】:我有一个网站,其中 ajax 调用将从 Asp.Net-Mvc 操作中获取一些 Json 数据。
现在我正在尝试在其中进行植入错误处理。
但我不知道该怎么做。
我找到的最简单的方法是在控制器操作中捕获异常,并返回一个带有错误消息的 Json 对象。然后在 ajax succes 函数中,如果它存在,我可以输出错误消息。
但我不确定这是最好的方法,所以我尝试使用 ajax 调用的错误函数。
我的代码是这样的:
$.ajax(
type: "POST",
url: "/home/geterror",
data: "",
dataType: "json",
success: function(result)
//do something
,
error: function(XMLHttpRequest, textStatus, errorThrown)
alert(XMLHttpRequest.responseText + " "+ XMLHttpRequest.status +" "+ textStatus +" "+ errorThrown);
);
我看到 XMLHttpRequest.responseText 是一个标准的 asp.net 错误页面,标题中有我的错误消息。 errorThrown 总是未定义的。 现在我试图从 XMLHttpRequest.responseText 中获取标题。但我不知道该怎么做。 (我尝试的一切都失败了..) 因此,如果有人有任何建议或更好的方法来处理 Ajax 调用的错误......
谢谢, 布鲁诺
【问题讨论】:
你不能只从 ASP.NET 发送描述错误的 JSON 对象,并将 HTTP 状态代码设置为一些错误,所以在你的 jQuery 端触发错误函数。 我一开始就在寻找那个,但没有成功,现在因为你的答案在下面,我可以。谢谢! 【参考方案1】:Bruno,我认为你应该在这里做出区分;您有想要向用户显示的自定义或预期错误,例如提供的无效值,您必须告诉用户“先生,您不能这样做,因为 bla bla”,另一方面,您还有其他意外错误,例如例如,您的代码中的错误会导致一些不需要的异常,例如插入中的 FK 违规。我的建议是全局处理后者,您可以设置查询 ajax 请求以具有一些常见行为,例如ajaxSetup。通过这种方式,您可以设置一个常见的错误处理程序(状态 500)。如果您有“预期”错误(我的示例中的第一种情况),您应该返回一个特殊对象,如 Darin 在他的答案中所示,并在成功回调中处理它,毕竟这是一个有效的场景,您应该处理它就这样。
【讨论】:
预期错误仍然是错误。网络相关或应用相关并不能使操作成功,应按此处理。 Anurag,也许我没有很好地表达自己,我的意思是您通常有替代流程,您必须告诉用户发生了某些事情。例如,假设一个用户忘记了他的密码并想要重置他的密码,并提供了他的电子邮件。如果他输入了不正确的电子邮件(例如不存在的电子邮件),那么您必须将这种情况作为预期情况处理,并在成功回调中处理它。当您遇到意外的 NullReferenceException 或任何其他意外错误时,情况会有所不同。 我明白您在回答中指的是替代流程,但您也可以将它们归类为错误(或异常)。我认为这是一个错误,因为由于任何原因未执行预期的操作(发送电子邮件)。如果这样处理,每个成功回调都不会乱扔if(result.wasSuccessful) .. else ..
,而是错误回调将接管,并根据返回的代码采取适当的行动。
嘿,谢谢你的回答!我已经在成功处理程序中处理“错误邮件”——错误。我正在寻找一个很好的解决方案来在我的 ajax 调用的错误处理程序中捕获真正的 trow 异常。 ajaxsetup 也非常适合这个。【参考方案2】:
在error
回调中处理错误处理要好得多。为了让 jQuery 将其检测为错误,您需要将 HTTP response code 设置为某个 4xx 或 5xx。我不了解 ASP.NET,所以请多多包涵,但你需要一些东西来达到这种效果。
Response.code = '401'
Response.text = JSON( message: 'An error occurred.', ... )
在客户端,parse the JSON response。
$.ajax(
...
error: function(request, status, error)
var result = JSON.parse(request.responseText);
alert(result.message);
);
);
【讨论】:
Thx,我最初是在寻找这样的解决方案,但我没有找到设置响应代码的方法。但我现在找到了。它适用于这个解决方案。【参考方案3】:public ActionResult Index()
try
// Do something
return Json(new status = true, errorMessage = "" );
catch (SomeSpecialExceptionYouWantToHandle e)
return Json(new status = false, errorMessage = e.Message );
还有 ajax 调用:
$.post('/home/index', , function(result)
if (result.status)
alert('success');
else
alert(result.errorMessage);
, 'json');
【讨论】:
这是我的第一个解决方案,但我的同事没有找到一个“好的解决方案”,所以我应该关注其他解决方案。但是谢谢!以上是关于ajaxcall 中的错误处理的主要内容,如果未能解决你的问题,请参考以下文章
Rust Web 全栈开发之 Web Service 中的错误处理