[jquery] jQuery Ajax 오류 처리, 사용자 정의 예외 메시지 표시

jQuery AJAX 오류 메시지에 사용자 정의 예외 메시지를 경고로 표시 할 수있는 방법이 있습니까?

예를 들어 Struts by 를 통해 서버 측에서 예외를 throw 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.StatusCode200이 아닌 다른 값으로 설정했는지 확인하십시오.를 사용하여 예외 메시지를 작성한 Response.Write후 다음을 사용하십시오.

xhr.responseText

.. 당신의 자바 스크립트에서.


답변

제어 장치:

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 오류 처리

모든 아약스 요청에 대해 일반적인 오류 처리가 필요한 경우. 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 응용 프로그램에서 작동합니다.

컨트롤러의 반환 유형은 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({
    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
  })

나는 그것이 도움이되기를 바랍니다