有没有什么方法可以在我的jQuery AJAX错误消息中显示自定义异常消息作为警报?
例如,如果我想通过Struts by 在服务器端抛出异常throw 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
,然后使用...
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"); } } });
通用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); });
您需要将其转换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) ); })
这就是我所做的,它到目前为止在MVC 5应用程序中工作.
Controller的返回类型是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"}; }
在客户端,这就是ajax功能的样子
$.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; } });
如果有人在2016年作为答案,请使用jQuery 3.0中不推荐使用.fail()
的错误处理.error()
$.ajax( "example.php" ) .done(function() { alert( "success" ); }) .fail(function(jqXHR, textStatus, errorThrown) { //handle error here })
我希望它有所帮助
这个答案是为了将来参考所有遇到这个问题的人提供的.解决方案包括两件事:
ModelStateException
在服务器上验证失败时抛出的自定义异常(当我们使用数据注释并使用强类型控制器操作参数时,模型状态报告验证错误)
自定义控制器操作错误筛选器 HandleModelStateExceptionAttribute
捕获自定义异常并返回HTTP错误状态,并在正文中显示模型状态错误
这为jQuery Ajax调用提供了最佳基础结构,以充分利用它们success
和error
处理程序.
$.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 }
整个问题在本博文中详细介绍,您可以在其中找到在您的应用程序中运行此代码的所有代码.
我发现这很好,因为我可以解析我从服务器发送的消息,并在没有堆栈跟踪的情况下向用户显示友好消息...
error: function (response) { var r = jQuery.parseJSON(response.responseText); alert("Message: " + r.Message); alert("StackTrace: " + r.StackTrace); alert("ExceptionType: " + r.ExceptionType); }
error:function (xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
}
这可能是由于JSON字段名称没有引号.
从以下位置更改JSON结构:
{welcome:"Welcome"}
至:
{"welcome":"Welcome"}
我相信Ajax响应处理程序使用HTTP状态代码来检查是否存在错误.
因此,如果您只是在服务器端代码上抛出Java异常,但是HTTP响应没有500状态代码jQuery(或者在这种情况下可能是XMLHttpRequest对象)将只假设一切正常.
我这样说是因为我在ASP.NET中遇到了类似的问题,我在这里抛出类似ArgumentException("不知道该做什么......"),但错误处理程序没有触发.
然后我将其设置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); } });
您在xhr对象中有一个抛出异常的JSON对象.只是用
alert(xhr.responseJSON.Message);
JSON对象公开了另外两个属性:'ExceptionType'和'StackTrace'