Обработка ошибок jQuery Ajax, показ пользовательских сообщений об исключениях - PullRequest
686 голосов
/ 18 декабря 2008

Можно ли как-то отобразить пользовательские сообщения об исключениях в качестве предупреждения в моем сообщении об ошибке jQuery AJAX?

Например, если я хочу выдать исключение на стороне сервера через Struts на 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.

Я не уверен, куда я иду не так. Что я могу сделать, чтобы решить эту проблему?

Ответы [ 20 ]

336 голосов
/ 16 января 2009

Убедитесь, что вы установили Response.StatusCode на значение, отличное от 200. Напишите сообщение об исключении, используя Response.Write, затем используйте ...

xhr.responseText

.. в вашем javascript.

206 голосов
/ 10 мая 2010

Контроллер:

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);
    }
});
96 голосов
/ 25 февраля 2012

ServerSide:

     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 и выведу ошибку на div с именем errorcontainer в верхней части содержимого HTML.

$("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);
                 });
80 голосов
/ 13 апреля 2011

Вам необходимо преобразовать responseText в JSON. Использование JQuery:

jsonValue = jQuery.parseJSON( jqXHR.responseText );
console.log(jsonValue.Message);
36 голосов
/ 13 февраля 2013

При звонке на 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) ); 
})
20 голосов
/ 19 мая 2016

Это то, что я сделал, и это работает до сих пор в приложении 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

$.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;
    }
});
17 голосов
/ 13 декабря 2016

Если кто-то здесь, как в 2016 году для ответа, используйте .fail() для обработки ошибок, поскольку .error() устарело с jQuery 3.0

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

Надеюсь, это поможет

14 голосов
/ 02 декабря 2011

Я нашел, что это хорошо, потому что я мог разобрать сообщение, которое я отправлял с сервера, и отобразить дружественное сообщение пользователю без трассировки стека ...

error: function (response) {
      var r = jQuery.parseJSON(response.responseText);
      alert("Message: " + r.Message);
      alert("StackTrace: " + r.StackTrace);
      alert("ExceptionType: " + r.ExceptionType);
}
14 голосов
/ 05 мая 2011

Общее / многоразовое решение

Этот ответ предназначен для использования в будущем для всех тех, кто сталкивается с этой проблемой. Решение состоит из двух вещей:

  1. Настраиваемое исключение ModelStateException, которое выдается при сбое проверки на сервере (состояние модели сообщает об ошибках проверки, когда мы используем аннотации данных и параметры действий контроллера со строгой типизацией)
  2. Пользовательский фильтр ошибок действий контроллера 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
}

Вся проблема подробно описана в этом сообщении в блоге , где вы можете найти весь код для запуска этого в вашем приложении.

7 голосов
/ 14 августа 2010

Вероятно, это связано с тем, что имена полей JSON не имеют кавычек.

Изменить структуру JSON с:

{welcome:"Welcome"}

до:

{"welcome":"Welcome"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...