Апрацоўка памылак jQuery Ajax, адлюстраванне карыстацкіх паведамленняў пра выключэнні

Ці ёсць спосаб паказаць прыстасаваныя паведамлення пра выключэнні ў якасці папярэджання ў паведамленні пра памылку 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.

Я не ўпэўнены, дзе я памыляюся. Што я магу зрабіць, каб выправіць гэтую праблему?

652
зададзены 18 снеж. 2008-12-18 15:06 '08 у 15:06 2008-12-18 15:06
@ 20 адказаў

Пераканайцеся, што вы ўсталёўваеце Response.StatusCode на нешта адрознае ад 200. Вашае паведамленьне аб выключэнні з дапамогай Response.Write , затым выкарыстоўвайце ...

 xhr.responseText 

.. ў вашым javascript.

324
16 янв. адказ дадзены Sprintstar 16 студз. 2009-01-16 17:25 '09 у 17:25 2009-01-16 17:25

кантролер:

 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"); } } 
border=0

Прагляд script:

 $.ajax({ type: "post", url: "/SomeController/SomeAction", success: function (data, text) { //... }, error: function (request, status, error) { alert(request.responseText); } }); 
195
10 мая '10 в 10:16 2010-05-10 10:16 адказ дадзены AlexMAS 10 мая '10 у 10:16 2010-05-10 10:16

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 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); }); 
91
25 февр. адказ дадзены Sanjeev Kumar Dangi 25 февр. 2012-02-25 20:09 '12 у 20:09 2012-02-25 20:09

Вам трэба пераўтварыць responseText ў JSON. Выкарыстанне JQuery:

 jsonValue = jQuery.parseJSON( jqXHR.responseText ); console.log(jsonValue.Message); 
72
13 апр. адказ дадзены Sydney 13 крас. 2011-04-13 18:49 '11 у 18:49 2011-04-13 18:49

Пры выкліку 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) ); }) 
33
13 февр. адказ дадзены Sam Jones 13 февр. 2013-02-13 15:30 '13 а 15:30 2013/02/13 15:30

Гэта тое, што я зрабіў, і ён працуе да гэтага часу ў дадатку 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"}; } work 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; } }); can be retrieved as following $.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; } }); 
20
19 мая '16 в 1:23 2016-05-19 01:23 адказ дадзены Cengiz Araz 19 мая '16 у 01:23 2016/05/19 01:23

Калі хто-то тут, як ў 2016 годзе для адказу, выкарыстоўвайце .fail() для апрацоўкі памылак, паколькі .error() састарэў ад jQuery 3.0

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

Я спадзяюся, што гэта дапаможа

15
13 дек. адказ дадзены Learner 13 снеж. 2016-12-13 20:41 '16 а 20:41 2016/12/13 20:41

Мне падалося, што гэта прыемна, таму што я магу разабраць паведамленне, якое я дасылаў з сервера, і паказваць карыстачу сяброўская паведамленне без stacktrace ...

 error: function (response) { var r = jQuery.parseJSON(response.responseText); alert("Message: " + r.Message); alert("StackTrace: " + r.StackTrace); alert("ExceptionType: " + r.ExceptionType); } 
14
02 дек. адказ дадзены crazyDiamond 02 снеж. 2011-12-02 00:33 '11 у 0:33 2011-12-02 00:33

Агульнае / шматразовае рашэнне

Гэты адказ прадастаўляецца для будучай спасылкі на ўсе тыя, якія сутыкаюцца з гэтай праблемай. Рашэнне складаецца з двух рэчаў:

  • Карыстацкае выключэнне 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 } 

Уся праблема падрабязна апісана ў гэтым паведамленні ў блогу , дзе вы можаце знайсці ўвесь код для запуску гэтага прыкладання.

13
05 мая '11 в 11:27 2011-05-05 11:27 адказ дадзены Robert Koritnik 05 мая '11 у 11:27 2011-05-05 11:27

Верагодна, гэта звязана з імёнамі палёў JSON, якія не маюць двукоссяў.

Зменіце структуру JSON на:

 {welcome:"Welcome"} 

у

 {"welcome":"Welcome"} 
7
14 авг. адказ дадзены Guy 14 жнів. 2010-08-14 16:01 '10 у 16:01 2010-08-14 16:01

Я лічу, што апрацоўшчык адказу Ajax выкарыстоўвае код стану HTTP, каб праверыць, ці была памылка.

Такім чынам, калі вы проста выкінеце выключэнне Java на свой код на боку сервера, але затым адказ HTTP не ўтрымлівае код стану jQuery 500 (ці, у дадзеным выпадку, магчыма, XMLHttpRequest ) будзе проста меркаваць, што ўсё ў парадку.

Я кажу гэта, таму што ў мяне была аналагічная праблема ў ASP.NET, дзе я кідаў нешта накшталт ArgumentException ( "Не ведаю, што рабіць ..."), але апрацоўшчык памылак не страляў.

Затым я ўсталяваў Response.StatusCode на 500 або 200, ці была ў мяне памылка ці не.

5
19 дек. адказ дадзены Vitor Silva 19 снеж. 2008-12-19 17:11 '08 у 17:11 2008-12-19 17:11

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
12 авг. адказ дадзены Nuri YILMAZ 12 жнів. 2011-08-12 01:18 '11 у 01:18 2011-08-12 01:18

 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); } } 
4
16 марта '18 в 6:33 2018-03-16 06:33 адказ дадзены Wara Haii 16 сакавіка '18 у 06:33 2018/03/16 06:33
 $("#save").click(function(){ $("#save").ajaxError(function(event,xhr,settings,error){ $(this).html{'error: ' (xhr ?xhr.status : '')+ ' ' + (error ? error:'unknown') + 'page: '+settings.url); }); }); 
4
06 марта '14 в 21:07 2014-03-06 21:07 адказ дадзены ibrahim ozboluk 06 сакавіка '14 а 21:07 2014/03/06 21:07

У вас ёсць аб'ект JSON генераванага выключэння ў аб'екце xhr. проста выкарыстоўвайце

 alert(xhr.responseJSON.Message); 

Аб'ект JSON падае два іншых ўласцівасці: "ExceptionType" і "StackTrace"

4
23 февр. адказ дадзены Edika 23 февр. 2017-02-23 13:33 '17 у 13:33 2017/02/23 13:33

Выкіньце новае выключэнне на сэрвэры, выкарыстоўваючы:

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 
3
18 янв. адказ дадзены Steffan 18 студз. 2010-01-18 21:05 '10 а 21:05 2010-01-18 21:05

Хоць прайшло шмат гадоў з тых часоў, як гэтае пытанне зададзены, я ўсё яшчэ не знайшоў xhr.responseText ў якасці адказу, які я шукаў. Ён вярнуў мне радок ў наступным фармаце:

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

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

 alert(xhr.responseJSON.message); 

xhr.responseJSON.message дае дакладнае паведамленне ад аб'екта Json, якое можа быць паказана карыстальнікам.

2
24 июня '16 в 5:05 2016-06-24 05:05 адказ дадзены Saket 24 чэрвеня '16 у 05:05 2016/06/24 05:05
 $("#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({... 

... ... });

1
09 марта '14 в 20:31 2014-03-09 20:31 адказ дадзены Monzur 09 сакавіка '14 у 20:31 2014/03/09 20:31

Спачатку нам трэба ўсталяваць <serviceDebug includeExceptionDetailInFaults = "True" /> у 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
09 мая '12 в 11:41 2012-05-09 11:41 адказ дадзены Avinash 09 мая '12 г. у 11:41 2012-05-09 11:41

Гэтая функцыя ў асноўным генеруе унікальны выпадковы ключ 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), радок, якая апісвае тып ўзнікла памылкі і неабавязковы аб'ект выключэння, калі гэта адбылося. Магчымыя значэння для другога аргументу (акрамя нуля) - гэта "тайм-аўт", "памылка", "перапыніць" і "parsererror". Пры памылкі HTTP errorThrown атрымлівае тэкставую частку статусу HTTP, напрыклад "Not Found" ці "Internal Server Error". Пачынаючы з jQuery 1.5, параметр памылкі можа прымаць масіў функцый. Кожная функцыя будзе выклікацца па чарзе. Заўвага. Гэты апрацоўшчык ня выклікаецца для междоменного скрыпту і междоменных запытаў JSONP.

0
21 февр. адказ дадзены Nishanth 21 февр. 2018-02-21 16:04 '18 у 16:04 2018/02/21 16:04

Іншыя пытанні па пазнаках або Задайце пытанне