„JQuery Ajax“ klaidų tvarkymas, rodant priskirtus išimties pranešimus

Ar yra būdas parodyti priskirtus išimties pranešimus kaip įspėjimą „jQuery AJAX“ klaidos pranešime?

Pavyzdžiui, jei noriu serverio pusėje padaryti išimtį per Struts, throw new ApplicationException("User name already exists"); Noriu sugauti šį pranešimą („vartotojo vardas jau yra“) „jQuery AJAX“ klaidos pranešime.

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

Antrajame įspėjime, kur įspėjau apie klaidą, gaunu undefined , o būsenos kodas yra 500.

Aš nesu įsitikinęs, kur esu neteisingas. Ką galiu padaryti, kad išspręstumėte šią problemą?

652
nustatyti 18 d 2008-12-18 15:06 '08 at 3:06 pm 2008-12-18 15:06
@ 20 atsakymų

Įsitikinkite, kad nustatėte „ Response.StatusCode kažką kitokio nei 200. Parašykite savo išimties pranešimą naudodami „ Response.Write , tada naudokite ...

 xhr.responseText 

.. jūsų „JavaScript“.

324
16 янв. Atsakymas iš Sprintstar Jan 16 2009-01-16 17:25 '09, 17:25, 2009-01-16 17:25

Valdiklis:

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

Peržiūrėti scenarijų:

 $.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 atsakymą pateikė AlexMAS 10 gegužės 10 d. 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 } } 

klientas:

  jQuery.ajax({// just showing error property error: function(jqXHR,error, errorThrown) { if(jqXHR.status alert(jqXHR.responseText); }else{ alert("Something went wrong"); } } }); 

Bendras „Ajax“ klaidų apdorojimas

Jei turiu atlikti tam tikrus bendruosius klaidų apdorojimo būdus visiems „ajax“ užklausoms. Aš įdiegsiu „ajaxError“ tvarkyklę ir parodysiu klaidą „div“ pavadinime „errorcontainer“ html turinio viršuje.

 $("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 февр. Atsakymas duotas Sanjeev Kumar Dangi 25 vasario mėn. 2012-02-25 20:09 „12 at 8:09 pm 2012-02-25 20:09

responseText tekstą reikia konvertuoti į JSON. Naudojant jQuery:

 jsonValue = jQuery.parseJSON( jqXHR.responseText ); console.log(jsonValue.Message); 
72
13 апр. Sidnėjaus atsakymas balandžio 13 d 2011-04-13 18:49 '11 at 18:49 2011-04-13 18:49

Skambindami „asp.net“, tai grąžins klaidos pranešimo antraštę:

Aš ne parašiau visą formatErrorMessage failą, bet manau, kad tai labai naudinga.

 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 февр. Atsakymą pateikė Sam Jones 13 vasaris 2013-02-13 15:30 '13, 15:30, 2013-02-13 15:30

Tai aš padariau, ir ji vis dar veikia MVC 5 programoje.

Valdiklio grįžimo tipas yra 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"}; } 

Ir kliento pusėje tai atrodo kaip ajax funkcija

 $.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 atsakymas pateikiamas Cengiz Araz gegužės 19 d., 16 d. 1:23 2016-05-19 01:23

Jei kas nors čia yra, kaip ir 2016 m., Atsakydami, naudokite .fail() , kad .error() klaidas, nes .error() pasenęs nuo jQuery 3.0

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

Tikiuosi, kad tai padės

15
13 дек. Mokinio atsakymas gruodžio 13 d 2016-12-13 20:41 '16 at 8:41 pm 2016-12-13 20:41

Man atrodė, kad tai buvo malonu, nes galėjau išsiaiškinti iš serverio išsiųstą pranešimą ir parodyti vartotojui draugišką pranešimą be stacktrace ...

 error: function (response) { var r = jQuery.parseJSON(response.responseText); alert("Message: " + r.Message); alert("StackTrace: " + r.StackTrace); alert("ExceptionType: " + r.ExceptionType); } 
14
02 дек. Atsakymas pateikiamas crazyDiamond 02 Dec. 2011-12-02 00:33 '11 prie 0:33 2011-12-02 00:33

Bendras / pakartotinai naudojamas sprendimas

Šis atsakymas pateikiamas ateityje visoms toms, kurios susiduria su šia problema. Sprendimą sudaro du dalykai:

  • Pasirinktinis „ ModelStateException išimtis, kuri atliekama atlikus patikrinimą serveryje (būsenos ataskaitos būsenos patikros klaidos, kai naudojame duomenų anotacijas ir naudojant stiprius, įvestus valdiklio veiksmo parametrus)
  • Vartotojo valdymo klaidų filtras HandleModelStateExceptionAttribute kuris sugauna pasirinktą išimtį ir grąžina HTTP klaidos būseną su modelio būsenos klaida kūno

Jis suteikia optimalią infrastruktūrą, skirtą „jQuery Ajax“ skambučiams, kad jie galėtų pasinaudoti visais savo potencialais success ir error tvarkytojais.

Kliento kodas

 $.ajax({ type: "POST", url: "some/url", success: function(data, status, xhr) { // handle success }, error: function(xhr, status, error) { // handle error } }); 

Serverio kodas

 [HandleModelStateException] public ActionResult Create(User user) { if (!this.ModelState.IsValid) { throw new ModelStateException(this.ModelState); } // create new user because validation was successful } 

Visa problema yra išsamiai aprašyta šiame dienoraščio įraše , kuriame galite rasti visą kodą, kad galėtumėte paleisti šią programą.

13
05 мая '11 в 11:27 2011-05-05 11:27 atsakė Robert Koritnik 05 gegužės 11 d. 11:27 2011-05-05 11:27

Tikriausiai tai yra dėl ne cituojamų JSON laukų pavadinimų.

Pakeiskite JSON struktūrą į:

 {welcome:"Welcome"} 

į

 {"welcome":"Welcome"} 
7
14 авг. atsakymas duotas Guy 14 rug. 2010-08-14 16:01 '10, 16:01, 2010-08-14 16:01

Manau, kad Ajax atsakymo tvarkytojas naudoja HTTP būsenos kodą, kad patikrintų, ar buvo klaida.

Taigi, jei paprasčiausiai išmeskite „Java“ išimtį į serverio pusės kodą, bet HTTP atsakyme nėra jQuery 500 būsenos kodo (arba, šiuo atveju, XMLHttpRequest , galbūt), jis tiesiog darys prielaidą, kad viskas yra tvarkinga.

Aš tai sakau, nes turėjau panašią problemą ASP.NET, kur aš kažką panašaus į „ArgumentException“ („Aš nežinau, ką daryti ...“), bet klaidų tvarkytojas neužsidegė.

Tada nustatiau „ Response.StatusCode iki 500 arba 200, ar turėjau klaidą.

5
19 дек. Atsakymą pateikė Vitor Silva gruodžio 19 d. 2008-12-19 17:11 '08, 17:11 2008-12-19 17:11

jQuery.parseJSON yra naudinga sėkmei ir klaidoms.

 $.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 авг. Atsakymą pateikė Nuri YILMAZ rugpjūčio 12 d 2011-08-12 01:18 '11 at 1: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 atsakymą pateikė Wara Haii kovo 16-18 d. 6:33 am 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 Atsakymas duotas ibrahim ozboluk kovo 6 d. 14 d. 21:07 2014-03-06 21:07

Xhr objekte yra sukurtas išimties JSON objektas. Tiesiog naudokite

 alert(xhr.responseJSON.Message); 

JSON objektas suteikia dvi kitas savybes: „ExceptionType“ ir „StackTrace“

4
23 февр. Atsakymą pateikė Edika . 2017-02-23 13:33 '17 bent 13:33 2017-02-23 13:33

Serveryje išmeskite naują išimtį naudodami:

Response.StatusCode = 500

Response.StatusDescription = ex.Message ()

Manau, kad StatusDescription grįžta į „Ajax“ skambutį ...

Pavyzdys:

  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 янв. Atsakė Steffan sausio 18 d 2010-01-18 21:05 '10, 21:05, 2010-01-18 21:05

Nors po šio klausimo buvo daug metų, aš vis dar xhr.responseText kaip atsakymo, kurio ieškojau. Jis grąžino eilutę man tokiu formatu:

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

kuriuos aš tikrai nenoriu parodyti vartotojams. Ką aš ieškojau:

 alert(xhr.responseJSON.message); 

xhr.responseJSON.message suteikia tikslią žinutę iš Json objekto, kuris gali būti rodomas naudotojams.

2
24 июня '16 в 5:05 2016-06-24 05:05 atsakymą sakė Saket birželio 16 d. 16: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 }); }); 

Jei yra kokia nors forma, atsiųskite patvirtinimą

tiesiog naudokite likusią kodo dalį

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

... ... });

1
09 марта '14 в 20:31 2014-03-09 20:31 atsakymas pateikiamas Monzur kovo 9 d. 14 d. 20:31 2014-03-09 20:31

Pirmiausia reikia nustatyti <serviceDebug includeExceptionDetailInFaults = "True" /> žiniatinklyje.config:

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

Be to, „Jquery“ lygiu, dalis klaidos, turite išanalizuoti klaidos atsakymą, kuriame yra tokia išimtis:

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

Tada, naudojant r.Message, galite rodyti išimčių tekstą.

Patikrinkite visą kodą: http://www.codegateway.com/2012/04/jquery-ajax-handle-exception-thrown-by.html

0
09 мая '12 в 11:41 2012-05-09 11:41 Atsakymas suteikiamas Avinashui gegužės 09 d., 12 val. 11:41 2012-05-09 11:41

Ši funkcija iš esmės sukuria unikalų atsitiktinį API raktą, o jei ne, pasirodo iššokantis dialogo >

Stebėjimo puslapyje:

 <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> 

Iš valdiklio:

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

Neprivalomas atgalinio ryšio parametras nurodo atgalinio ryšio funkciją, kuri bus atlikta, kai baigiamas apkrovos () metodas. Atgalinio ryšio funkcija gali turėti skirtingus parametrus:

Tipas: Funkcija (jqXHR jqXHR, String textStatus, String errorThrown)

Funkcija, kuria skambinama, jei užklausa nepavyksta. Funkcija trunka tris argumentus: jqXHR objektas (jQuery 1.4.x, XMLHttpRequest), eilutė, apibūdinanti įvykusį klaidos tipą, ir pasirinktinis išimties objektas, jei jis įvyko. Galimos antro argumento reikšmės (išskyrus nulį) yra „timeout“, „error“, „interrupt“ ir „parsererror“. Kai įvyksta HTTP klaida, errorThrown gauna HTTP būsenos teksto dalį, pvz., „Not Found“ („nerasta“) arba „Internal Server Error“ (vidinė serverio klaida). Pradedant nuo jQuery 1.5, klaidos parametras gali priimti daugybę funkcijų. Kiekviena funkcija bus vadinama eilės tvarka. Pastaba Šis tvarkytojas nėra vadinamas kryžminio domeno scenarijumi ir tarp domeno JSONP užklausomis.

0
21 февр. Atsakymas pateikiamas Nishanth ॐ 21 vasario mėn. 2018-02-21 16:04 '18, 4:04 val. 2018-02-21 16:04

Kiti klausimai apie „ žymes arba užduoti klausimą