jQuery的Ajaxerror handling,显示自定义的exception消息

有没有什么方法可以显示自定义exception消息作为我的jQuery AJAX错误消息中的警报?

例如,如果我想通过throw new ApplicationException("User name already exists");通过Struts在服务器端抛出exceptionthrow new ApplicationException("User name already exists"); ,我想在jQuery AJAX错误消息中捕获此消息(“用户名已存在”)。

 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); } }); } }); 

在第二个提醒,我提醒抛出的错误,我越来越undefined ,状态码是500。

我不知道我哪里错了。 我能做些什么来解决这个问题?

请确保您将Response.StatusCode设置为200以外的内容。使用Response.Write编写您的exception消息,然后使用…

 xhr.responseText 

..在你的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 } } 

客户端:

  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"); } } }); 

通用的Ajaxerror handling

如果我需要为所有的ajax请求做一些通用的error handling。 我将设置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); }); 

您需要将responseText转换为JSON。 使用JQuery:

 jsonValue = jQuery.parseJSON( jqXHR.responseText ); console.log(jsonValue.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) ); }) 

我发现这是很好的,因为我可以parsing出我从服务器发送的消息,并显示友好的消息给用户没有堆栈跟踪…

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

这是我做的,它在MVC 5应用程序中工作至今。

控制器的返回types是ContentResult。

 public ContentResult DoSomething() { if(somethingIsTrue) { Response.StatusCode = 500 //Anything other than 2XX HTTP status codes should work Response.Write("My Message"); return new ContentResult(); } //Do something in here// string json = "whatever json goes here"; return new ContentResult{Content = json, ContentType = "application/json"}; } 

而在客户端这是什么ajaxfunction看起来像

 $.ajax({ type: "POST", url: URL, data: DATA, dataType: "json", success: function (json) { //Do something with the returned json object. }, error: function (xhr, status, errorThrown) { //Here the status code can be retrieved like; xhr.status; //The message added to Response object in Controller can be retrieved as following. xhr.responseText; } }); 

一般/可重用的解决scheme

这个答案是提供给所有那些遇到这个问题的未来参考。 解决scheme包含两件事情:

  1. 自定义exception ModelStateException在服务器上validation失败时引发(当我们使用数据注释并使用强types控制器操作参数时,模型状态报告validation错误)
  2. 自定义控制器操作错误filter HandleModelStateExceptionAttribute捕获自定义exception,并返回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 } 

整个问题在这个博客文章中详细介绍,你可以find所有的代码来运行你的应用程序。

如果有人在2016年作为答案,请使用.fail()进行error handling,因为.error()从jQuery 3.0

 $.ajax( "example.php" ) .done(function() { alert( "success" ); }) .fail(function(jqXHR, textStatus, errorThrown) { //handle error here }) 

我希望它有帮助

这可能是由JSON字段名称不带引号造成的。

从以下位置更改JSON结构:

 {welcome:"Welcome"} 

至:

 {"welcome":"Welcome"} 

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

所以如果你只是在你的服务器端代码上抛出一个Javaexception,但是HTTP响应没有500状态码,那么jQuery(或者在这种情况下可能是XMLHttpRequest对象)会假设一切正常。

我这样说是因为我有一个ASP.NET类似的问题,我抛出了像一个ArgumentException(“不知道该怎么办…”),但error handling程序没有触发。

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

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); } }); 

抛出一个新的exception在服务器上使用:

Response.StatusCode = 500

Response.StatusDescription = ex.Message()

我相信StatusDescription返回到Ajax调用…

例:

  Try Dim file As String = Request.QueryString("file") If String.IsNullOrEmpty(file) Then Throw New Exception("File does not exist") Dim sTmpFolder As String = "Temp\" & Session.SessionID.ToString() sTmpFolder = IO.Path.Combine(Request.PhysicalApplicationPath(), sTmpFolder) file = IO.Path.Combine(sTmpFolder, file) If IO.File.Exists(file) Then IO.File.Delete(file) End If Catch ex As Exception Response.StatusCode = 500 Response.StatusDescription = ex.Message() End Try 
 $("#save").click(function(){ $("#save").ajaxError(function(event,xhr,settings,error){ $(this).html{'error: ' (xhr ?xhr.status : '')+ ' ' + (error ? error:'unknown') + 'page: '+settings.url); }); }); 

在xhr对象中有一个引发exception的JSON对象。 只是使用

 alert(xhr.responseJSON.Message); 

JSON对象公开了另外两个属性:'ExceptionType'和'StackTrace'

虽然问了这个问题已经很多年了,但是我仍然没有findxhr.responseText作为我正在寻找的答案。 它以下面的格式返回了string:

 "{"error":true,"message":"The user name or password is incorrect"}" 

我绝对不想向用户展示。 我正在寻找的东西如下所示:

 alert(xhr.responseJSON.message); 

xhr.responseJSON.message给我从Json对象中可以显示给用户的确切消息。

 $("#fmlogin").submit(function(){ $("#fmlogin").ajaxError(function(event,xhr,settings,error){ $("#loading").fadeOut('fast'); $("#showdata").fadeIn('slow'); $("#showdata").html('Error please, try again later or reload the Page. Reason: ' + xhr.status); setTimeout(function() {$("#showdata").fadeOut({"opacity":"0"})} , 5500 + 1000); // delays 1 sec after the previous one }); }); 

如果有任何forms提交与validation

只需使用其余的代码

 $("#fmlogin").validate({... 

... ... });

首先,我们需要在web.config中设置<serviceDebug includeExceptionDetailInFaults =“True”/>:

 <serviceBehaviors> <behavior name=""> <serviceMetadata httpGetEnabled="true" /> **<serviceDebug includeExceptionDetailInFaults="true" />** </behavior> </serviceBehaviors> 

除了在jQuery的水平错误的一部分,你需要parsing包含exception的错误响应,如:

 .error(function (response, q, t) { var r = jQuery.parseJSON(response.responseText); }); 

然后使用r.Message你可以动手显示exception文本。

检查完整的代码: http : //www.codegateway.com/2012/04/jquery-ajax-handle-exception-thrown-by.html