Обработка ошибок 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 ]

6 голосов
/ 16 марта 2018

 error:function (xhr, ajaxOptions, thrownError) {
        alert(xhr.status);
        alert(thrownError);
      }
в коде ошибки ajax запрос на ошибку перехвата соединения между клиентом и сервером если вы хотите показать сообщение об ошибке вашего приложения отправьте в объеме успеха

например

success: function(data){
   //   data is object  send  form server 
   //   property of data 
   //   status  type boolean 
   //   msg     type string
   //   result  type string
  if(data.status){ // true  not error 
         $('#api_text').val(data.result);
  }
  else 
  {
      $('#error_text').val(data.msg);
  }

}
5 голосов
/ 12 августа 2011

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); }
});
5 голосов
/ 19 декабря 2008

Я полагаю, что обработчик ответов Ajax использует код состояния HTTP для проверки наличия ошибки.

Так что, если вы просто сгенерируете Java-исключение в коде на стороне сервера, но в ответе HTTP не будет кода состояния 500, jQuery (или в этом случае, вероятно, объект XMLHttpRequest ) будет просто предполагать все было хорошо.

Я говорю это, потому что у меня была похожая проблема в ASP.NET, где я генерировал что-то вроде ArgumentException («Не знаю, что делать ...»), но обработчик ошибок не срабатывал.

Затем я устанавливаю Response.StatusCode на 500 или 200 независимо от того, была ли у меня ошибка или нет.

5 голосов
/ 23 февраля 2017

У вас есть объект JSON исключительной ситуации в объекте xhr. Просто используйте

alert(xhr.responseJSON.Message);

Объект JSON предоставляет два других свойства: 'ExceptionType' и 'StackTrace'

4 голосов
/ 06 марта 2014
$("#save").click(function(){
    $("#save").ajaxError(function(event,xhr,settings,error){
        $(this).html{'error: ' (xhr ?xhr.status : '')+ ' ' + (error ? error:'unknown') + 'page: '+settings.url);
    });
});
3 голосов
/ 18 января 2010

Создайте новое исключение на сервере, используя:

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
2 голосов
/ 24 июня 2016

Хотя прошло уже много лет с тех пор, как этот вопрос задан, я все еще не нахожу xhr.responseText в качестве ответа, который я искал. Он вернул мне строку в следующем формате:

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

, который я определенно не хочу показывать пользователям. То, что я искал, выглядит примерно так:

alert(xhr.responseJSON.message);

xhr.responseJSON.message дает мне точное сообщение от объекта Json, которое может быть показано пользователям.

1 голос
/ 09 марта 2014
$("#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
    });
});

Если есть какая-либо форма, отправьте с подтверждением

просто используйте остаток кода

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

... ... });

0 голосов
/ 09 мая 2012

Сначала нам нужно установить в web.config:

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

В дополнение к этому на уровне jquery в части ошибки необходимо проанализировать ответ об ошибке, который содержит исключение, подобное:

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

Затем, используя r.Message, вы можете фактически показать текст исключения.

Проверьте полный код: http://www.codegateway.com/2012/04/jquery-ajax-handle-exception-thrown-by.html

0 голосов
/ 21 февраля 2018

Эта функция в основном генерирует уникальные случайные ключи API, и в случае, если этого не происходит, появляется всплывающее диалоговое окно с сообщением об ошибке

На странице просмотра:

<div class="form-group required">
    <label class="col-sm-2 control-label" for="input-storename"><?php echo $entry_storename; ?></label>
    <div class="col-sm-6">
        <input type="text" class="apivalue"  id="api_text" readonly name="API" value="<?php echo strtoupper(substr(md5(rand().microtime()), 0, 12)); ?>" class="form-control" />                                                                    
        <button type="button" class="changeKey1" value="Refresh">Re-Generate</button>
    </div>
</div>

<script>
$(document).ready(function(){
    $('.changeKey1').click(function(){
          debugger;
        $.ajax({
                url  :"index.php?route=account/apiaccess/regenerate",
                type :'POST',
                dataType: "json",
                async:false,
                contentType: "application/json; charset=utf-8",
                success: function(data){
                  var result =  data.sync_id.toUpperCase();
                        if(result){
                          $('#api_text').val(result);
                        }
                  debugger;
                  },
                error: function(xhr, ajaxOptions, thrownError) {
                  alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
                }

        });
    });
  });
</script>

с контроллера:

public function regenerate(){
    $json = array();
    $api_key = substr(md5(rand(0,100).microtime()), 0, 12);
    $json['sync_id'] = $api_key; 
    $json['message'] = 'Successfully API Generated';
    $this->response->addHeader('Content-Type: application/json');
    $this->response->setOutput(json_encode($json));
}

Необязательный параметр обратного вызова указывает функцию обратного вызова, которая запускается при завершении метода load (). Функция обратного вызова может иметь разные параметры:

Тип: Функция (jqXHR jqXHR, String textStatus, String errorThrown)

Функция, вызываемая в случае сбоя запроса. Функция получает три аргумента: объект jqXHR (в jQuery 1.4.x, XMLHttpRequest), строка, описывающая тип возникшей ошибки и необязательный объект исключения, если таковой произошел. Возможные значения для второго аргумента (кроме нуля): «timeout», «error», «abort» и «parsererror». При возникновении ошибки HTTP errorThrown получает текстовую часть состояния HTTP, например «Не найдено» или «Внутренняя ошибка сервера». Начиная с jQuery 1.5, установка ошибки может принимать массив функций. Каждая функция будет вызываться по очереди. Примечание. Этот обработчик не вызывается для междоменных сценариев и междоменных запросов JSONP.

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