custom-exceptions - jquery Ajax错误处理, 显示自定义异常消息

  显示原文与译文双语对照的内容

是否有一些方法可以在我的jQuery Ajax错误消息中将自定义异常消息显示为警报?

jQuery中的Ajax错误 message, 。例如如果我想抛出异常在服务器端通过架结构由"抛出新的ApplicationException("User name already exists");",我想捕获这个异常消息


jQuery("#save").click(function () {
 if (jQuery('#form').jVal()) {
 jQuery.ajax({
 type:"POST",
 url:"saveuser.do",
 dataType:"html",
 data:"userId=" + encodeURIComponent(trim(document.forms[0].userId.value)),
 success: function (response) {
 jQuery("#usergrid").trigger("reloadGrid");
 clear();
 alert("Details saved successfully!!!");
 },
 error: function (xhr, ajaxOptions, thrownError) {
 alert(xhr.status);
 alert(thrownError);
 }
 });
 }
});

在通知抛出的错误的第二个通知上,我得到未定义的,状态代码是 500.

我不确定我在哪里出错。 如何解决这个问题?

时间:

请确定你正在将 Response.StatusCode 设置为非 200. 使用 Response.Write 编写异常消息,然后使用。。

 
xhr.responseText

 

in在你的javascript中。

位控制器:


public class ClientErrorHandler : FilterAttribute, IExceptionFilter
{
 public void OnException(ExceptionContext filterContext)
 {
 var response = filterContext.RequestContext.HttpContext.Response;
 response.Write(filterContext.Exception.Message);
 response.ContentType = MediaTypeNames.Text.Plain;
 filterContext.ExceptionHandled = true;
 }
}

[ClientErrorHandler]
public class SomeController : Controller
{
 [HttpPost]
 public ActionResult SomeAction()
 {
 throw new Exception("Error message");
 }
}

视图脚本:


$.ajax({
 type:"post", url:"/SomeController/SomeAction",
 success: function (data, text) {
//...
 },
 error: function (request, status, error) {
 alert(request.responseText);
 }
});

小时:


 doPost(HttpServletRequest request, HttpServletResponse response){ 
 try{//logic
 }catch(ApplicationException exception){ 
 response.setStatus(400);
 response.getWriter().write(exception.getMessage());
//just added semicolon to end of line

 }
 }

ClientSide:


 jQuery.ajax({//just showing error property
 error: function(jqXHR,error, errorThrown) { 
 if(jqXHR.status&&jqXHR.status==400){
 alert(jqXHR.responseText); 
 }else{
 alert("Something went wrong");
 }
 }
 }); 

通用的Ajax错误处理工具

如果我需要对所有ajax请求执行一般性错误处理。 我将设置ajaxError处理程序并在html内容顶部名为errorcontainer的div上显示错误。


$("div#errorcontainer")
. ajaxError(
 function(e, x, settings, exception) {
 var message;
 var statusErrorMap = {
 '400' :"Server understood the request, but request content was invalid.",
 '401' :"Unauthorized access.",
 '403' :"Forbidden resource can't be accessed.",
 '500' :"Internal server error.",
 '503' :"Service unavailable."
 };
 if (x.status) {
 message =statusErrorMap[x.status];
 if(!message){
 message="Unknown Error n.";
 }
 }else if(exception=='parsererror'){
 message="Error.nParsing JSON Request failed.";
 }else if(exception=='timeout'){
 message="Request Time out.";
 }else if(exception=='abort'){
 message="Request was aborted by the server";
 }else {
 message="Unknown Error n.";
 }
 $(this).css("display","inline");
 $(this).html(message);
 });

如果调用 ASP.NET,这将返回错误消息标题:

我没有自己写所有的formatErrorMessage,但我发现它非常有用。


function formatErrorMessage(jqXHR, exception) {

 if (jqXHR.status === 0) {
 return ('Not connected.nPlease verify your network connection.');
 } else if (jqXHR.status == 404) {
 return ('The requested page not found. [404]');
 } else if (jqXHR.status == 500) {
 return ('Internal Server Error [500].');
 } else if (exception === 'parsererror') {
 return ('Requested JSON parse failed.');
 } else if (exception === 'timeout') {
 return ('Time out error.');
 } else if (exception === 'abort') {
 return ('Ajax request aborted.');
 } else {
 return ('Uncaught Error.n' + jqXHR.responseText);
 }
}


var jqxhr = $.post(addresshere, function() {
 alert("success");
})
.done(function() { alert("second success"); })
.fail(function(xhr, err) { 

 var responseTitle= $(xhr.responseText).filter('title').get(0);
 alert($(responseTitle).text() +"n" + formatErrorMessage(xhr, err) ); 
})

我发现这很不错,因为我可以解析从服务器发送的消息,并向用户显示一条友好消息,而不使用 stacktrace 。。


error: function (response) {
 var r = jQuery.parseJSON(response.responseText);
 alert("Message:" + r.Message);
 alert("StackTrace:" + r.StackTrace);
 alert("ExceptionType:" + r.ExceptionType);
}

通用/可以重用解决方案

这个答案是为那些遇到这个问题的所有人提供的。 解决方案包括两个方面:

  1. 在服务器上验证失败时引发的自定义异常ModelStateException ( 模型状态报告错误时验证错误,使用强类型控制器操作参数)
  2. 自定义控制器动作错误筛选器HandleModelStateExceptionAttribute 捕获自定义异常,并返回在正文中带有模型状态错误的HTTP错误状态

这为 jQuery Ajax调用提供了最佳的基础设施,使用 successerror 处理程序来使用它们的全部潜力。

客户端代码


$.ajax({
 type:"POST",
 url:"some/url",
 success: function(data, status, xhr) {
//handle success
 },
 error: function(xhr, status, error) {
//handle error
 }
});

服务器端代码


[HandleModelStateException]
public ActionResult Create(User user)
{
 if (!this.ModelState.IsValid)
 {
 throw new ModelStateException(this.ModelState);
 }

//create new user because validation was successful
}

但是所有问题,这个博客文章 时间域内,你可以在应用程序中找到所有的代码来运行这个。

我相信Ajax响应处理程序使用HTTP状态代码来检查是否有错误。

所以如果你在服务器端代码中抛出一个Java异常,但是HTTP响应没有 500状态代码,jQuery ( 或者在这种情况下,可能是 XMLHttpRequest 对象) 就会认为一切都很好。

我之所以这么说是因为我在 ASP.NET 中遇到了类似的问题,我正在抛出类似 ArgumentException("Don't know what to do...")的东西,但错误处理程序没有触发。

然后将 Response.StatusCode 设置为 500或者 200,无论是否有错误。

这可能是由于JSON字段名称没有引号引起的。

从以下位置更改JSON结构:

 
{welcome:"Welcome"}

 

到:


{"welcome":"Welcome"}

jQuery.parseJSON 对于成功和错误非常有用。


$.ajax({
 url:"controller/action",
 type: 'POST',
 success: function (data, textStatus, jqXHR) {
 var obj = jQuery.parseJSON(jqXHR.responseText);
 notify(data.toString());
 notify(textStatus.toString());
 },
 error: function (data, textStatus, jqXHR) { notify(textStatus); }
});

...