当前位置:  开发笔记 > 编程语言 > 正文

jQuery Ajax错误处理,显示自定义异常消息

如何解决《jQueryAjax错误处理,显示自定义异常消息》经验,为你挑选了14个好方法。

有没有什么方法可以在我的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.

我不确定我哪里出错了.我该怎么做才能解决这个问题?



1> Sprintstar..:

确保设置Response.StatusCode为200以外的其他内容.使用编写例外消息Response.Write,然后使用...

xhr.responseText

..在你的JavaScript中.


这仍然是2年半后这样做的正确方法... :)我进一步实际上返回了我自己的错误JSON对象,可以处理单个或多个错误,非常适合服务器端表单验证.
仅当您确保设置了元类型时才设置xhr.responseJSON(例如"Content-type:application/json").这是我刚刚遇到的问题; responseText已设置 - responseJSON未设置.
我现在在2014年.JSON占主导地位的时代.所以我使用`xhr.responseJSON`.:d

2> 小智..:

控制器:

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


这不是问题的"正确"答案,但它肯定会显示更高级别的问题解决方案......很好!
我相信你还应该将*response.StatusCode = 500;*行添加到OnException方法中.
我改编了这个 - 因为我想要500状态代码,但是在状态描述中有异常消息(而不是"内部服务器错误") - `response.StatusCode =(int)HttpStatusCode.InternalServerError;`和`response.StatusDescription = filterContext.Exception.Message;`
如果您使用的是IIS7或更高版本,则可能需要添加:response.TrySkipIisCustomErrors = true;
我正在做类似的事情.如果在开发盒上完成所有操作,它可以正常工作.如果我尝试从网络上的其他框连接,xhr.responseText包含通用错误页面html而不是我的自定义消息,请参阅http://stackoverflow.com/questions/3882752/returning-a-response-on-error使用-ASP净MVC-和jQuery的-in-Ajax的呼叫

3> Sanjeev Kuma..:

服务器端:

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



4> Sydney..:

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

jsonValue = jQuery.parseJSON( jqXHR.responseText );
console.log(jsonValue.Message);


+1'因为这是目前这个问题的唯一正确答案!您可以调用"jsonValue.Message"来获取异常消息.
实际上它不是正确的答案,因为问题没有询问JSON,并且示例请求特别要求HTML作为响应.

5> Sam Jones..:

如果调用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) ); 
})



6> Cengiz Araz..:

这就是我所做的,它到目前为止在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;
    }
});



7> Learner..:

如果有人在2016年作为答案,请使用jQuery 3.0中不推荐使用.fail()的错误处理.error()

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

我希望它有所帮助


据我所知,jQuery 3.0中不推荐使用jqXHR.error()(实际上已将其删除),但是据我所知,不赞成对$ .ajax()的`error`和`success`回调。

8> Robert Korit..:

一般/可重用的解决方案

这个答案是为了将来参考所有遇到这个问题的人提供的.解决方案包括两件事:

    ModelStateException在服务器上验证失败时抛出的自定义异常(当我们使用数据注释并使用强类型控制器操作参数时,模型状态报告验证错误)

    自定义控制器操作错误筛选器 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
}

整个问题在本博文中详细介绍,您可以在其中找到在您的应用程序中运行此代码的所有代码.



9> crazyDiamond..:

我发现这很好,因为我可以解析我从服务器发送的消息,并在没有堆栈跟踪的情况下向用户显示友好消息...

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



10> 小智..:

 error:function (xhr, ajaxOptions, thrownError) {
        alert(xhr.status);
        alert(thrownError);
      }


11> Guy..:

这可能是由于JSON字段名称没有引号.

从以下位置更改JSON结构:

{welcome:"Welcome"}

至:

{"welcome":"Welcome"}



12> Vitor Silva..:

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

因此,如果您只是在服务器端代码上抛出Java异常,但是HTTP响应没有500状态代码jQuery(或者在这种情况下可能是XMLHttpRequest对象)将只假设一切正常.

我这样说是因为我在ASP.NET中遇到了类似的问题,我在这里抛出类似ArgumentException("不知道该做什么......"),但错误处理程序没有触发.

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



13> Nuri YILMAZ..:

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



14> 小智..:

您在xhr对象中有一个抛出异常的JSON对象.只是用

alert(xhr.responseJSON.Message);

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

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有